在我的Ubuntu機器上嘗試使用NASM和GCC製作一個非常小的程序時,我注意到了一些奇怪的東西。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