【发布时间】:2017-01-17 14:35:39
【问题描述】:
在我的 Ubuntu 机器上尝试使用 NASM 和 GCC 制作一个非常小的程序时,我发现了一些奇怪的东西。
以下代码在 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,而是汇编语言。不要垃圾标签! (调用库函数不会改变这一点!)