nasm汇编处理输入参数

GLOBAL main

extern puts

SECTION .text

main:

push rdi;save registers that puts uses  保存参数个数

push rsi;  保存参数字符串指针数组,

sub  rsp, 8; must align stack before call 进入函数的时候,call 保留了下一条指令到栈里面

mov rdi, [rsi]; the augument string todisplay 字符串指针数组首地址 存入rdi

call puts; print it 调用puts, 输出

;

add rsp, 8;restore %rsp to pre-aligned value 恢复栈

pop rsi; //restore registersputs used pop 参数个数

pop rdi; pop 参数指针

add rsi, 8; point next argument 64位的,一个地址8位,往下偏移一个地址

dec rdi;count down 减小rdi, 参数个数的值,

jnz main ;如果还不是0,就会跳到main的地方继续执行

ret

对于栈对齐,我们做一个验证看看。

#include <stdio.h>

void Test()

{

 63a:   55                      push   %rbp

 63b:   48 89 e5                mov    %rsp,%rbp

    printf("hello world\n");

 63e:   48 8d 3d af 00 00 00    lea    0xaf(%rip),%rdi        # 6f4 <_IO_stdin_used+0x4>

 645:   e8 c6 fe ff ff          callq  510 <puts@plt>

}

 64a:   90                      nop

 64b:   5d                      pop    %rbp

 64c:   c3                      retq

000000000000064d <main>:

int main()

{

 64d:   55                      push   %rbp

 64e:   48 89 e5                mov    %rsp,%rbp

    Test();

 651:   b8 00 00 00 00          mov    $0x0,%eax

 656:   e8 df ff ff ff          callq  63a <Test>

    return 0;

 65b:   b8 00 00 00 00          mov    $0x0,%eax

}

这一段汇编里面,我们并没有看到类似stack align的动作,是因为call调用的时候,

先是RIP寄存器保存到栈里面了。然后push %rbp ,栈底寄存器保存进栈,刚好对齐了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值