在我的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