Ошибка сегментации в программе на С++ с ассемблерной вставкой
Пишу код на С++ с ассемблерной вставкой. Ищется наибольший и наименьший элемент в массиве. Если компилирую под х64, то получаю:
g++ hell.cpp -o hell -no-pie
hell.cpp: Assembler messages:
hell.cpp:54: Error: unsupported instruction `mov'
Если компилировать под х32, то получаю ошибку сегментации:
g++ -m32 hell.cpp -o hell -no-pie
./hell
Value of 1 element is 7
Value of 2 element is 6
Value of 3 element is 8
Segmentation fault
Пробовал посмотреть что там происходит через gdb, но так и не разобрался. Подскажите кто-нибудь, как можно это исправить
Код программы:
#include <iostream>
int main()
{
int arr_size, min, max;
cin >> arr_size;
int *arr = new int[arr_size];
asm (
"movl %2, %%ecx;" //указывает на первый элемент массива
"movl %3, %%ebx;" //количество итераций для цикла top
"movl %%ecx, (%0);"//первый элемент массива становится наибольшим
"movl %%ecx, (%1);"//и наименьшим на данный момент
"top:"
"xorl %%eax, %%eax;"
"movl %0, %%eax;" // %0 будет хранить max элемент
"xorl %%edx, %%edx;"
"movl (%%ecx), %%edx;"//в edx записывается очередной элемент массива
"cmp %%eax, %%edx;"
"jge greateri;"
"xorl %%eax, %%eax;"
"movl %1, %%eax;" // %1 будет хранить min элемент
"cmp %%eax, %%edx;"
"jle lessi;"
"jmp endi;"
"greateri:" //выполняется, если элемент массива больше max
"movl %%edx, %%eax;"
"movl %%eax, (%0);"
"jmp endi;"
"lessi:" //выполняется, если элемент массива меньше min
"movl %%edx, %%eax;"
"movl %%eax, (%1);"
"jmp endi;"
"endi:"
"addl $0x4, %%ecx;" //перемещаем указатель на следующий элемент массива
"decl %%ebx;"
"jnz top;"
:"+g"(max), "+g"(min)
:"g"(arr), "g"(arr_size)
:
);
return 0;
}
Ответы (1 шт):
Автор решения: DrMcSheen
→ Ссылка
В C++ ассемблер пишется так:
asm {
push eax
mov eax,0
pop eax
}
И спокойно трассируется обычным си отладчиком.