能力值:
( 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 楼
谢谢支持!
|
|
|