AT&T汇编格式与Intel汇编格式区别(根据由尚德视频教程整理)

来源:互联网 发布:影视后期剪辑软件界面 编辑:程序博客网 时间:2024/05/01 01:47

1.  寄存器引用

引用寄存器要在寄存器号前加%,如mov %eax,%ebx

 

2.  操作数顺序

操作数排列是从源(左)到目的(右),如

Mov %eax(),%ebx(目的)

 

3.  常数/立即数的格式

使用立即数,要在数前面加$,,如mov $4,%ebx

符号常数直接引用如mov value ,%ebx

引用符号地址在符号前加$,mov $value,%ebx

 

4.  操作数的长度

操作数的长度用加在指令后的符号表示

b(byte),w(word),l(long)movw %eax,%ebx

 

5.  绝对转移和调用指令中的操作数

AT&T汇编格式中,绝对转移和调用指令(jmp/call)的操作数前要加上“*”做前缀

 

6.  绝对转移和调用指令

远转移指令和远调用指令的操作码,在AT&T汇编格式中为“ljmp”和”lcall”,而在intel汇编格式中则为“jmp far”和“call far”。

AT&T 格式

ljmp $section,$offset

lcall $section,$offset

Intel格式

Jmp far section:offset

Call far section:offset

7.  远程返回指令

lret $statck_adjust

ret far stack_adjust

8.  寻址方式

Section:disp(base,index,scale)表示,计算方法是:

Base + index*scale + disp

Section:[base + index*scale + disp]

movl -4(%ebp),%eax               mov eab,[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

 

9.  _asm_(“asm statements”:outputs:inputs:register-modified);

10.              _asm_(“pushl %%eax /n/t”

“mov $0,%%eax /n/t”

“popl %eax”);

 

 

int seg;

char addr;

 

{register char_res:/

asm(“push %%fs/n/t”

“movw %%ax,%%fs/n/t”

Movb %%fs:%2,%%al/n/t”

Pop %%fs”

:"=a"(_res):"0”(seg):”m”(*(addr)));/

_res;}

 

说明:

0:表示与前一个寄存器相同的寄存器

addr:前面定义的字符变量

seg:前面定义的整型变量

m:前面定义的变量???

用C语言描述:

eax = seg;

m这段没听明白

 

int main(){

int a1 = 10,b1 = 0;

_asm_(“movl %1,%%eax,;//n//r”

“movl %%eax,%%ecx;”

:”=a”(b1)

:”b”(a1)

:”%eax”);

printf(“Result:%d,%d//n”,a1,b1);}

C语言来描述如下:

输入:ebx = a1;

输出:b1 = eax;

汇编流程:

eax = ebx = a1;

ecx = eax;

 

 

“a”,”b”,”c”,”d”分别表示寄存器eax,ebx,ecx,edx

“S”和“D”表示寄存器esi,edi

“r”表示任何寄存器

原创粉丝点击