При попытке сделать очень маленькую программу с NASM и GCC на моей машине Ubuntu, я заметил что-то странное.Разница между стеклом памяти i386 и x86-64
Следующий код компилируется нормально при 64-битном NASM и GCC:
global main
extern puts
section .text
main:
push rax
mov rdi, message
call puts
jmp exit
exit:
;return stack memory
pop rax
ret
message:
db "Hello from NASM!", 0
Но при попытке компиляции тот же код (только регистры изменены) под 32-битной NASM и GCC, он будет либо дефект сегментации результата и/или случайные символы. Почему это происходит? Имеет ли архитектура x64 другой способ хранения памяти в стеке, чем i386? Если да, то как можно предотвратить это поведение?
Вызывающие соглашения разные, не так ли? –
Может быть, использовать отладчик и выяснить, где происходит ошибка? –
Если на прошлой неделе они не изменили всю спецификацию языка, это не C, а язык ассемблера. Не спам-теги! (вызов функций библиотеки не меняет этого!) – Olaf