关于Linux AT&T Asm的零星小结

原创 2006年05月19日 00:17:00
本文作者:sodme
本文出处:http://blog.csdn.net/sodme
声明:本文可以不经作者同意任意转载、复制、传播,但任何对本文的引用均须保留本文的作者、出处及本行声明信息!谢谢!

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

我们知道linux的asm采用的是AT&T汇编语法, 关于它的详细文档在以下的地址可以获得:
http://asm.sourceforge.net/articles/linasm.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;
}

形如以上形式, 加两个":", 是很多AT&T 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].

为了有一个更加感性的认识, 下面再贴段AT&T 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

由这段代码来看AT&T asm与intel asm的不同点可能印象更深刻一些:
1.源操作数与目的操作数,在两种语法下截然相反, AT&T asm中, 左边的是源, 右边的是目的;
2.几乎所有的数据操作指令都会有intel asm指令字后加个l, 表示的是long;
3.立即数用$开头;
4.寄存器是以%开头;
5.间接寻址符号是"()", 而不是intel asm的"[]";

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

intel asm下的:
mov ebx, dword ptr [LABLE_TEST]

到了AT&T asm下可能就不得不换成:

lea LABLE_TEST, %ebx
movl (%ebx), %ebx

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

相关文章推荐

『转载』__asm__ __volatile__ GCC的内嵌汇编语法 AT&amp;T汇编语言语法

__asm__ __volatile__ GCC的内嵌汇编语法 AT&T汇编语言语法这篇帖子由于没署作者名,所以我转的时候也没怎么署,但还是谢谢了。AT&T ASM Syntax1 Overview ...

Linux下的AT&amp;T语法(即GNU as 汇编语法)入门

http://blogold.chinaunix.net/u3/105209/showart_2085748.html学习这么长时间,一直在C语言这一层面上钻研和打拼,日积月累,很多关于C的疑惑在书本...
  • ztguang
  • ztguang
  • 2016年03月30日 10:18
  • 1687

AT&amp;T将于6月向开发者发布语音识别A…

AT&T的研究结构花费了20多年的时间来发展Watson语音和语音引擎,使其翻译成口语化。现在,AT&T正计划在6月份向开发者发布Watson API,来加快语音识别的空间的发展和创新。而不必再去开发...

__asm__ __volatile__ GCC的内嵌汇编语法 AT&T汇编语言语法(一)

开 发一个OS,尽管绝大部分代码只需要用C/C++等高级语言就可以了,但至少和硬件相关部分的代码需要使用汇编语言,另外,由于启动部分的代码有大小限 制,使用精练的汇编可以缩小目标代码的Size。另外,...
  • yarsen
  • yarsen
  • 2012年04月12日 10:20
  • 519

AT&T ASM Syntax 详解_0

内容摘要 如果你是计算机专业的话,在大学里你应该学习过Intel格式的8086/80386汇编,这里就不再讨论。如果我们选择的OS开发工具是GCC以及GAS的话,就必须了解AT&T汇编语言语法,因为G...
  • p8x8x8
  • p8x8x8
  • 2011年06月08日 13:02
  • 366

__asm__ __volatile__ GCC的内嵌汇编语法 AT&T汇编语言语法(二)

3、立即数约束 如果一个Input/Output操作表达式的C/C++表达式是一个数字常数,不想借助于任何寄存器,则可以使用立即数约束。 由于立即数在C/C++中只能作为右值,所以对于使用...
  • yarsen
  • yarsen
  • 2012年04月12日 10:21
  • 342

__asm____volatile__GCC的内嵌汇编语法AT&T汇编语言语法

__asm____volatile__GCC的内嵌汇编语法AT&T汇编语言语法 2006年11月16日06:33 来源:ChinaUnix博客 作者:Dave DeWalt 编辑:周荣茂 评论:...

__asm__ __volatile__ GCC的内嵌汇编语法 AT&T汇编语言语法

这篇帖子由于没署作者名,所以我转的时候也没怎么署,但还是谢谢了。 AT&T ASM Syntax 1 Overview 开发一个OS,尽管绝大部分代码只需要用C/C++等高级语言就可以了,但至...
  • jpcfei
  • jpcfei
  • 2011年08月16日 17:48
  • 479

AT&T x86 asm 语法

AT&T x86 asm 语法 译:el8el8@m4in.org>,alert7alert7@m4in.org> from m4in security teams(www.m4in.org...
  • wbcuc
  • wbcuc
  • 2012年03月16日 15:31
  • 725

AT&amp;T ASM语法

  • 2012年04月24日 21:48
  • 15KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于Linux AT&amp;T Asm的零星小结
举报原因:
原因补充:

(最多只允许输入30个字)