gpt4 book ai didi

assembly - x86_64 汇编命令行参数

转载 作者:行者123 更新时间:2023-12-04 05:51:19 25 4
gpt4 key购买 nike

要在 Mac OS X 上获取 x86_64 中的命令行参数,我可以执行以下操作:

_main:
sub rsp, 8 ; 16 bit stack alignment
mov rax, 0
mov rdi, format
mov rsi, [rsp + 32]
call _printf

其中格式为“%s”。 rsi 被设置为 argv[0]。

因此,从这里,我得出了(我认为)堆栈最初的样子:

 top of stack
<- rsp after alignment
return address <- rsp at beginning (aligned rsp + 8)
[something] <- rsp + 16
argc <- rsp + 24
argv[0] <- rsp + 32
argv[1] <- rsp + 40
... ...
bottom of stack

等等。对不起,如果这很难阅读。我想知道 [something] 是什么。经过几次测试,我发现它通常只是 0。但是,偶尔,它是一些(看似)随机数。

另外,你能告诉我其余的堆叠图是否正确吗?

最佳答案

根据AMD64 ABI (3.2.3, Parameter Passing), main(int argc, char **argv)的参数被传递给(从左到右的顺序)rdi & rsi 因为它们属于 INTEGER 类。 envp,如果被使用,将被传递到 rdx,等等。gcc 将它们放入当前帧如下(大概是为了方便?释放寄存器?):

mov    DWORD PTR [rbp-0x4],  edi
mov QWORD PTR [rbp-0x10], rsi

省略帧指针时,寻址相对于rsp。通常,argv 将比 rbp 低一个八字节(argc 排在第一位,尽管这不是强制的)因此:

# after prologue
mov rax, QWORD PTR [rbp-0x10] # or you could grab it from rsi, etc.
add rax, 0x8
mov rsi, QWORD PTR [rax]
mov edi, 0x40064c # format
call 400418 <printf@plt>

关于assembly - x86_64 汇编命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10004448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com