x64函数参数超过4个的栈分析

本文分析了一段C++代码,展示了如何在函数调用中传递参数。在`t1`函数中,前四个参数`rcx`、`rdx`、`r8`和`r9`分别用于传递`a`、`b`、`c`和`d`,而第五个参数`e`和第六个参数`f`则存储在栈中,地址分别为`rsp+20h`和`rsp+28h`。在进入`test`函数时,这些参数被正确地传递并计算。这体现了C++编译器在release版本中的优化策略。
摘要由CSDN通过智能技术生成

写一个测试函数,关闭优化,编译为release版本

int test(int a,int b,int c,int d,int e,int f)
{
	return a + b + c + d + e + f;
}

.text:00000001400010B0 ; void t1(void)
.text:00000001400010B0 ?t1@@YAXXZ      proc near               ; CODE XREF: main+1C↓p
.text:00000001400010B0                                         ; DATA XREF: .pdata:000000014000400C↓o
.text:00000001400010B0
.text:00000001400010B0 e               = dword ptr -18h
.text:00000001400010B0 f               = dword ptr -10h
.text:00000001400010B0
.text:00000001400010B0                 sub     rsp, 38h
.text:00000001400010B4                 mov     dword ptr [rsp+28h], 6 ; f
.text:00000001400010BC                 mov     dword ptr [rsp+20h], 5 ; e
.text:00000001400010C4                 mov     r9d, 4          ; d
.text:00000001400010CA                 mov     r8d, 3          ; c
.text:00000001400010D0                 mov     edx, 2          ; b
.text:00000001400010D5                 mov     ecx, 1          ; a
.text:00000001400010DA                 call    ?test@@YAHHHHHHH@Z ; test(int,int,int,int,int,int)
.text:00000001400010DF                 add     rsp, 38h
.text:00000001400010E3                 retn
.text:00000001400010E3 ?t1@@YAXXZ      endp

从上图可以看出在函数调用函数前, 前4个参数在rcx rdx r8 r9,从第5个参数开始就在栈中,
第5个参数 rsp+20h 第6个参数rsp+28h.

进入到函数第一句代码时,第5个参数在28h,第6个参数在30h

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值