玩一玩 Ubuntu 下的 VSCode 编程( 二 )

接下来观察下汇编代码,可以发现走的都是 栈空间 。
24mytest(a,b,c,d,e,f,g);=> 0x565562a2 <+80>: sub$0x4,%esp0x565562a5 <+83>: pushl-0xc(%ebp)0x565562a8 <+86>: pushl-0x10(%ebp)0x565562ab <+89>: pushl-0x14(%ebp)0x565562ae <+92>: pushl-0x18(%ebp)0x565562b1 <+95>: pushl-0x1c(%ebp)0x565562b4 <+98>: pushl-0x20(%ebp)0x565562b7 <+101>: pushl-0x24(%ebp)0x565562ba <+104>: call0x5655620d <mytest(int, int, int, int, int, int, int)>0x565562bf <+109>: add$0x20,%esp还有一个问题,在x86下能不能混着用寄存器呢?就比如 windows 上的 fastcall 调用协定,其实是可以的,就是在 mytest 方法上加 __attribute__((regparm(N))) 标记,这里的 N 不能超过 3,即参与传递的寄存器个数,修改后如下:
__attribute__((regparm(3)))int mytest(int a, int b, int c, int d, int e, int f, int g){printf("a=%d,b=%d,c=%d,d=%d,e=%d,f=%d,g=%d", a, b, c, d, e, f, g);return 0;}然后把程序跑起来再次观察,很明显的看到这次用了 eax, edx, ecx 来传递方法的前三个参数,汇编代码如下:
24mytest(a,b,c,d,e,f,g);=> 0x565562aa <+80>: mov-0x1c(%ebp),%ecx0x565562ad <+83>: mov-0x20(%ebp),%edx0x565562b0 <+86>: mov-0x24(%ebp),%eax0x565562b3 <+89>: pushl-0xc(%ebp)0x565562b6 <+92>: pushl-0x10(%ebp)0x565562b9 <+95>: pushl-0x14(%ebp)0x565562bc <+98>: pushl-0x18(%ebp)0x565562bf <+101>: call0x5655620d <mytest(int, int, int, int, int, int, int)>0x565562c4 <+106>: add$0x10,%esp三:总结习惯了 Intel 风格的汇编,再看 AT&T 风格的会极度不舒服,简直是逆天哈,感觉都是反方向的,相信熟悉一段时间之后就好了,本篇的一个简单搭建,希望对你有帮助 。

【玩一玩 Ubuntu 下的 VSCode 编程】


推荐阅读