分享
 
 
 

关于Linux Asm的零星小结

王朝system·作者佚名  2006-05-19
窄屏简体版  字體: |||超大  

本文作者:sodme

本文出处:http://blog.csdn.net/sodme

声明:本文可以不经作者同意任意转载、复制、传播,但任何对本文的引用均须保留本文的作者、出处及本行声明信息!谢谢!

前段时间作性能优化时, 研究过一段时间的linux asm, 一点体会写出来与大家共享.

地球人都知道linux的asm采用的是AT&T汇编语法, 关于它的详细文档在以下的地址可以获得:

http://www.cs.utah.edu/dept/old/texinfo/as/as_toc.html

看文档虽然是比较规矩的作法, 但对于诸如我等对未知世界好奇心过盛而又心急易上火的人类而言, 看代码要远来得轻松和契意:

#include <iostream>

int main(void)

{

int result, input;

input = 2;

result = 3;

__asm__

(

"movl %1, %0\n"

"subl $1, %1\n"

"movl %1, %0"

: "=r"(result)

: "m"(input)

);

std::cout << "result=" << result << std::endl;

return 0;

}

形如以上形式, 加两个":", 是很多Linux asm教程里都会说到的方法, 其作用在于规定输入输出参数, 而在汇编里会以%1和0%之类的来代替这些参数, 这样就实现了参数传递和计算结果的返回. 但是, 我一向比较少采用这种作法.

个人认为, 对于性能优化而言, gcc -O3选项所作的确实已经非常牛X了, 但对于不便采用-O3优化处理的, 手动优化还是有必要的. 而在手动优化这方面, 一般都会比较关注如何在C或C++里嵌入汇编, 直接使用汇编语言的方法写算法我觉得没必要而且编码时间较长也复杂. 所以, 一般我会这么干: 先用高级语言写出函数原型, 对于已有算法, 我会先gcc -S编译生成汇编代码, 然后在这个代码的基础之上再作优化. 这样作的另一个好处是, 对于参数和局部变量的地址引用可以通过分析编译后的汇编代码而轻易获得, 这样也方便我们在自己的汇编算法里来引用它们. 当然, 另外遇到的一种问题是, 可能有时我们会直接写汇编, 比如进行一些简单且快速运算之类的.

我所使用的内嵌汇编形式, 一般会直接这么写:

int func( int a, int b)

{

...

__asm__

(

...

"movl $1, %eax\n"

...

);

...

}

想把哪段代码进行优化, 就直接将那段代码用__asm__()的方式括起来, 但不用加":"的方式规定输入输出参数, 因为我觉得%1和%0这样的方式更象是机器所看的东西, 而不是人类应该看的, 人类最起码也要看个"以字母开头的, 字母和数字的集合"这样定义出来的东西. 我一般会使用经过对ebp修正的地址来间接寻址访问变量, 也就是一般情况下, 函数变量访问的最普通方式[ebp + xx].

为了有一个更加感性的认识, 下面再贴段linux asm代码:

.LFB1411:

pushl %ebp

.LCFI0:

movl %esp, %ebp

.LCFI1:

subl $4, %esp

.LCFI2:

movl %eax, -4(%ebp)

movl -4(%ebp), %eax

movl (%eax), %eax

movl %eax, %edx

shrl $31, %edx

movl -4(%ebp), %eax

movl (%eax), %eax

shrl $6, %eax

xorl %eax, %edx

movl -4(%ebp), %eax

movl (%eax), %eax

shrl $4, %eax

xorl %eax, %edx

movl -4(%ebp), %eax

movl (%eax), %eax

shrl $2, %eax

xorl %eax, %edx

movl -4(%ebp), %eax

movl (%eax), %eax

shrl %eax

xorl %eax, %edx

movl -4(%ebp), %eax

movl (%eax), %eax

xorl %edx, %eax

andl $1, %eax

movl %eax, %edx

sall $31, %edx

movl -4(%ebp), %eax

movl (%eax), %eax

shrl %eax

orl %eax, %edx

movl -4(%ebp), %eax

movl %edx, (%eax)

leave

ret

由这段代码来看Linux asm与intel asm的不同点可能印象更深刻一些:

1.源操作数与目的操作数,在两种语法下截然相反, Linux asm中, 左边的是源, 右边的是目的;

2.几乎所有的数据操作指令都会有intel asm指令字后加个l, 表示的是long;

3.立即数用$开头;

4.寄存器是以%开头;

5.间接寻址符号是"()", 而不是intel asm的"[]";

从形式上来看, 似乎两种语法的不同之处也就这么多. 但实际的应用中, 可能还存在很多的不一样, 比如:

intel asm下的:

mov ebx, dword ptr [LABLE_TEST]

到了Linux asm下可能就不得不换成:

lea LABLE_TEST, %ebx

movl (%ebx), %ebx

(未完待续, 想起来再加)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有