【发布时间】:2011-08-16 01:36:53
【问题描述】:
基本上,我通读了http://www.nasm.us/links/unix64abi 的部分内容,在第 29 页,它显示了 C 程序的初始进程堆栈。
我的问题是:我正在尝试从 x86-64 nasm 与 glibc 交互,根据上面显示的内容,argc 应该位于 rsp。所以下面的代码应该打印 argc:
[SECTION .data]
PrintStr: db "You just entered %d arguments.", 10, 0
[SECTION .bss]
[SECTION .text]
extern printf
global main
main:
mov rax, 0 ; Required for functions taking in variable no. of args
mov rdi, PrintStr
mov rsi, [rsp]
call printf
ret
但事实并非如此。如果我在代码中犯了任何错误或告诉我实际的堆栈结构是什么,有人可以启发我吗?
谢谢!
更新:我只是随机尝试了一些偏移量并将“mov rsi, [rsp]”更改为“mov rsi, [rsp+28]”就可以了。
但这意味着显示的堆栈结构是错误的。有谁知道 x86-64 精灵的初始堆栈布局是什么?相当于http://asm.sourceforge.net/articles/startup.html 会非常好。
更新 2: 我省略了如何构建此代码。我这样做:
nasm -f elf64 -g <filename>
gcc <filename>.o -o <outputfile>
【问题讨论】:
标签: c assembly x86-64 nasm glibc