x64传参规则研究--飘云[转自飘云BLOG]
http://www.dllhook.com/?id=10By 飘云/P.Y.G
https://www.chinapyg.com
http://www.dllhook.com
先写一段函数测试:
/*
000000013F991062 mov r9,0x44444444444444
000000013F99106C mov r8,0x333333333333333
000000013F991076 mov rdx,0x222222222222222
000000013F991080 mov rcx,0x111111111111111
000000013F99108A call @ILT+0(?FunTest@@YAX_J000@Z)
*/
FunTest(0x111111111111111, 0x222222222222222, 0x333333333333333, 0x44444444444444);
这里看到顺序是 rcx rdx r8 r9 从左到右 -- 返回值 RAX
再写一段更多参数的试试:
/*
000000013FFC32CF mov rax,0x77777777777777
000000013FFC32D9 mov ,rax
000000013FFC32DE mov rax,0x66666666666666
000000013FFC32E8 mov ,rax
000000013FFC32ED mov rax,0x555555555555555
000000013FFC32F7 mov ,rax
000000013FFC32FC mov r9,0x44444444444444
000000013FFC3306 mov r8,0x333333333333333
000000013FFC3310 mov rdx,0x222222222222222
000000013FFC331A mov rcx,0x111111111111111
000000013FFC3324 call @ILT+10(?FunTest2@@YAX_J000000@Z)
*/
FunTest2(0x111111111111111, 0x222222222222222, 0x333333333333333, 0x44444444444444, 0x555555555555555, 0x66666666666666, 0x77777777777777);
这里可以看到前4个不变,,后面开始用栈传递--前四个寄存器占了32字节(0x20) 所以第五个参数开始从 传参 以此类推,,每8byte一组 ......
再写一段浮点参数的试试:
/*
000000013F5F3399 movss xmm0,
000000013F5F33A1 movss ,xmm0
000000013F5F33A7 movss xmm0,
000000013F5F33AF movss ,xmm0
000000013F5F33B5 movss xmm0,
000000013F5F33BD movss ,xmm0
000000013F5F33C3 movss xmm3,
000000013F5F33CB movss xmm2,
000000013F5F33D3 movss xmm1,
000000013F5F33DB movss xmm0,
000000013F5F33E3 call @ILT+15(?FunTest3@@YAXMMMMMMM@Z)
*/
FunTest3(11.0, 22.0, 33.0, 44.0, 55.0, 66.0, 77.0);
这里看到浮点从 xmm0-xmm3 固定顺序传入 前4参数 从左到右 其他和上面同理
微软官方文档:
http://msdn.microsoft.com/zh-cn/library/9z1stfyw.aspx
专坐Q婶沙发~~
感谢楼主分享,非常感谢~~ 感谢楼主分享 谢谢 收藏
页:
[1]