zoukankan      html  css  js  c++  java
  • AT&T与INTEL的汇编语言语法的区别

    1、大小写
    INTEL格式的指令使用大写字母,而AT&T格式的使用小写字母。
    例:
        INTEL                          AT&T
          MOV EAX,EBX              movl %ebx,%eax

    2、操作数赋值方向
    在INTEL语法中,第一个表示目的操作数,第二个表示源操作数,赋值方向从右向左。
    AT&T语法第一个为源操作数,第二个为目的操作数,方向从左到右,合乎自然。
    例:
        INTEL                          AT&T
          MOV EAX,EBX              movl %ebx,%eax

    3、前缀
    在INTEL 语法中寄存器和立即数不需要前缀;AT&T 中寄存器需要加前缀“%”;立即数
    需要加前缀“$”。
    例:
        INTEL                         AT&T
          MOV EAX,1                 movl $1,%eax

    标签就是变量名,一个变量有两个方面的意义,一个是其存储地址,即指针;另一个是该存储地址内的数据内容,

    $label表示的是前者, label或者(label)表示的是后者,在jmp指令中,要用指针$label。

    总线锁定前缀“lock”:总线锁定操作。“lock”前缀在Linux 核心代码中使用很多,特别是SMP代码中。当总线锁定后其它CPU不能存取锁定地址处的内存单元。

    远程跳转指令和子过程调用指令的操作码使用前缀“l“,分别为ljmp,lcall,与之
    相应的返回指令伪lret。
    例:
        INTEL                                      AT&T
          CALL FAR SECTION:OFFSET    lcall $secion:$offset
          JMP FAR SECTION:OFFSET      ljmp $secion:$offset
          RET FAR SATCK_ADJUST         lret $stack_adjust

    4 、间接寻址语法
    INTEL 中基地址使用“[”、“] ”,而在AT&T 中使用“(”、“) ”;另外处理复杂操作数的
    语法也不同, INTEL 为Segreg:[base+index*scale+disp] , 而在AT&T 中为
    %segreg:disp(base,index,sale),其中segreg,index,scale,disp都是可选的,在指定
    index而没有显式指定Scale的情况下使用默认值1。Scale和disp不需要加前缀“&”。
        INTEL                                                      AT&T
          Instr                                                        instr
          foo,segreg:[base+index*scale+disp]     %segreg:disp(base,index,scale),foo

    5、后缀
    AT&T 语法中大部分指令操作码的最后一个字母表示操作数大小,“b”表示byte(一个
    字节);“w ”表示word(2 个字节);“l ”表示long(4 个字节)。INTEL 中处理内存操作


    时也有类似的语法如:BYTE PTR、WORD PTR、DWORD PTR。
    例:
       INTEL                                      AT&T
         mov al, bl                               movb %bl,%al
         mov ax,bx                              movw %bx,%ax
         mov eax, dword ptr [ebx]      movl (%ebx), %eax

    在AT&T 汇编指令中,操作数扩展指令有两个后缀,一个指定源操作数的字长,另一个
    指定目标操作数的字长。AT&T 的符号扩展指令的为“movs”,零扩展指令为“movz”(相应
    的Intel指令为“movsx”和“movzx”)。因此,“movsbl %al,%edx”表示对寄存器al 中的
    字节数据进行字节到长字的符号扩展,计算结果存放在寄存器edx中。下面是一些允许的操
    作数扩展后缀:
                        bl: 字节->长字
                        bw: 字节->字
                        wl: 字->长字
    跳转指令标号后的后缀表示跳转方向,“f”表示向前(forward),“b”表示向后(back)。
    例:
                 jmp 1f
                1:    jmp 1f
                1:

    6、指令
    INTEL 汇编与AT&T 汇编指令基本相同,差别仅在语法上。关于每条指令的语法可以参考I386

    Ma

  • 相关阅读:
    target runtime apache v6.0 not defined解决
    java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/JspApplicationContext;
    The valid characters are defined in RFC 7230 and RFC 3986问题
    invalid END header解决方法
    You have more than one version of ‘org.apache.commons.logging.Log’ visible, which is not allowed问题解决
    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    在eclipse中import java web项目时遇到的一些问题并将该项目通过tomcat发布
    java byte转string 涉及到字节流中有中文
    spring+mybatis框架搭建时遇到Mapped Statements collection does not contain value for...的错误
    试试看读一下Zepto源码
  • 原文地址:https://www.cnblogs.com/smwikipedia/p/1364204.html
Copyright © 2011-2022 走看看