Ошибка сегментации в программе на С++ с ассемблерной вставкой

Пишу код на С++ с ассемблерной вставкой. Ищется наибольший и наименьший элемент в массиве. Если компилирую под х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
}

И спокойно трассируется обычным си отладчиком.

→ Ссылка