能力值:
( LV3,RANK:20 )
2 楼
自己先顶一下 顶!d=====( ̄▽ ̄*)b
能力值:
( LV3,RANK:30 )
3 楼
第一个参数保存在rdi中,第二个保存在rsi中,接下来依次保存在rdx,rcx,r8,r9
你确定? 什么平台啊?自己写代码试试~
能力值:
( LV3,RANK:30 )
4 楼
抱歉,没有看完
Windows x64 ABI X64下,Windows 实现了一套和AMD64ABI有些许不同的ABI
能力值:
( LV3,RANK:20 )
5 楼
Linux和windows的标准是不一样的,我翻译完这篇文章后也认真的查看了相关的汇编代码,确实如此的
能力值:
( LV7,RANK:110 )
6 楼
int Add(int a,int b,int c,int d,int e)
{
return a+b+c+d+e;
}
Add(2,3,4,5,6);
000000013FBD2DF1 mov dword ptr [rsp+20h],6
000000013FBD2DF9 mov r9d,5
000000013FBD2DFF mov r8d,4
000000013FBD2E05 mov edx,3
000000013FBD2E0A mov ecx,2
000000013FBD2E0F call Add (13FBD100Fh)
调用的时候只有前4个参数是寄存器传参
能力值:
( LV7,RANK:110 )
7 楼
[QUOTE=GeekCheng;1371040]int Add(int a,int b,int c,int d,int e)
{
return a+b+c+d+e;
}
Add(2,3,4,5,6);
000000013FBD2DF1 mov dword ptr [rsp+20h],6
000000013FBD2...[/QUOTE]
不对啊,怎么还会有edx和ecx
能力值:
( LV3,RANK:20 )
8 楼
编译器是使用edx和ecx,但是真正参与传递参数是rdx和rcx
如果你要测试,我建议你使用负数,这样,能使用到参数的最高位,这样,编译器就不会“偷懒”了
能力值:
( LV7,RANK:110 )
9 楼
懂了
int Add(LONGLONG a,LONGLONG b,LONGLONG c,LONGLONG d,int e)
{
return a+b+c+d+e;
}
Add(-2,-3,-4,-5,6);
000000013FBA1041 mov dword ptr [rsp+20h],6
000000013FBA1049 mov r9,0FFFFFFFFFFFFFFFBh
000000013FBA1050 mov r8,0FFFFFFFFFFFFFFFCh
000000013FBA1057 mov rdx,0FFFFFFFFFFFFFFFDh
000000013FBA105E mov rcx,0FFFFFFFFFFFFFFFEh
000000013FBA1065 call Add (13FBA100Ah)
能力值:
( LV3,RANK:20 )
10 楼
现象不一定能说明本质,但多实验肯定会更加接近本质
能力值:
( LV4,RANK:50 )
11 楼
[QUOTE=GeekCheng;1371040]int Add(int a,int b,int c,int d,int e)
{
return a+b+c+d+e;
}
Add(2,3,4,5,6);
000000013FBD2DF1 mov dword ptr [rsp+20h],6
000000013FBD2...[/QUOTE]
那么并没有用rsi和rdi传参
能力值:
( LV7,RANK:110 )
12 楼
文章中说了,Windows自己实现了与AMD 不同的ABI,Linux与Windows不一样,楼上也说了
能力值:
( LV3,RANK:30 )
13 楼
讲解的好棒~刚好解决困惑~感谢!
能力值:
( LV3,RANK:20 )
14 楼
对你有帮助就好,翻译文章就是为了减少language gaps
能力值:
( LV2,RANK:10 )
15 楼
感谢分享。
能力值:
( LV3,RANK:20 )
16 楼
谢谢支持!