首页 > 代码库 > SunnyOS准备

SunnyOS准备

技术分享

 

 

AT&T语法汇编和Intel语法汇编比较:

1.  前缀:

①在AT&T语法中,寄存器以‘%‘为前缀立即数则以‘$‘为前缀,而Intel语法中则没有;

②在Intel语法中,十六进制立即数以‘h‘结尾,二进制立即数则以‘b‘结尾。另外对于编译器来说,十六进制立即数不能以字符a~f打头,需要在前面上加上‘0‘。而AT&T语法中,十六进制使用 "  0x数据  "来表示

Intel Syntax AT&T Syntax
mov     eax, 1 movl    $1, %eax
mov     ebx, 0ffh movl    $0xff, %ebx
int        80h int        $0x80

2. 运算方向:

在运算方向上,Intel语法与AT&T语法正好相反。 在Intel语法中,第一个是目标操作数,第二个是源操作数,而在AT&T语法中,第一个是源操作数,第二个是目标操作数。

技术分享

3.内存运算:

Intel语法格式是 segreg:[base + index * scale + disp]
AT&T语法格式则是%segreg:disp(base, index, scale)

AT&T语法

Intel语法

movl -4(%ebp), %eax

mov eax, [ebp - 4]

movl array(, %eax, 4), %eax

mov eax, [eax*4 + array]

movw array(%ebx, %eax, 4), %cx

mov cx, [ebx + 4*eax + array]

movb $4, %fs:(%eax)

mov fs:eax, 4

 

在Intel语法中,内存单元用方括号表达,而在AT&T语法中,它是由圆括号括起来的。

4. 后缀:

后缀表示的是操作数的大小:

AT&T语法中‘l‘代表long(32bit), ‘w‘代表word(16bit)和‘b‘代表byte(1字节);Intel语法使用byte ptr, word ptr, dword ptr

AT&T中指令:

movb  传送字节

movw  传送字

movl   传送双字

5. 跳转指令;

AT&T 格式:ljump $section, $offset

Intel 格式: jmp far section:offset

AT&T 格式:lcall $section, $offset

Intel 格式:call far section:offset

 

直接跳转:跳转目标是作为指令的一部分编码的(有可能是相对位移地址).

例如: jmp Label_1

间接跳转:跳转目标是从寄存器或存储器位置中读出的. 写法是在" * "后面跟一个操作数指示符.

例如: jmp *%eax 用寄存器%eax中的值作为跳转目标

  技术分享

    jmp *(%eax) 以%eax中的值作为读入的地址, 从存储器中读出跳转目标

  技术分享

 


 

 

SunnyOS准备