接下来观察下汇编代码,可以发现走的都是 栈空间 。
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 编程】
推荐阅读
- 几个玩转2D/3D渲染的开源JS库,助你快速实现各种2D/3D动画特效
- 官方的 Ubuntu 精简 ISO 真的“精简”吗?
- |孙俪晒假期游玩照,粉色背带裤搭配编织草帽,清新又减龄!
- 核桃|买文玩的几个误区
- 文玩|2023年暴跌的文玩
- 饵料|5月钓鱼,鱼情有5个变化,玩技巧不如抓规律
- 文玩|分享一块老坑会卡场口的冰种翡翠片料
- 文玩|文玩好“香”之徒,就选择这6种文玩,沁人心脾!
- |玩文玩,为什么越买越贵?原来是因为这4个原因!
- 陈建州|“黑人”陈建州:把大小S玩弄于股掌之间的男人,至今性取向是谜