您的位置:首页 > 其它

AT&T assembly 笔记

2013-07-04 10:31 162 查看
引用寄存器要在寄存器号前加百分号%,如“movl %eax, %ebx”。

80386有如下寄存器:

8个32-bit寄存器 %eax,%ebx,%ecx,%edx,%edi,%esi,%ebp,%esp;

8个16-bit寄存器,它们事实上是上面8个32-bit寄存器的低16位:%ax,%bx,%cx,%dx,%di,%si,%bp,%sp;

8个8-bit寄存器:%ah,%al,%bh,%bl,%ch,%cl,%dh,%dl。它们事实上是寄存器%ax,%bx,%cx,%dx的高8位和低8位;

6个段寄存器:%cs(code),%ds(data),%ss(stack), %es,%fs,%gs;

3个控制寄存器:%cr0,%cr2,%cr3;

6个debug寄存器:%db0,%db1,%db2,%db3,%db6,%db7;

2个测试寄存器:%tr6,%tr7;

8个浮点寄存器栈:%st(0),%st(1),%st(2),%st(3),%st(4),%st(5),%st(6),%st(7)。

操作数排列是从源(左)到目的(右),如“movl %eax(源), %ebx(目的)

使用立即数,要在数前面加符号$, 如“movl $0x04, %ebx”

或者:

para = 0x04

movl $para, %ebx

间接寻址方式

Intel语法

AT&T语法
指令 foo,segreg:[base+index*scale+disp]

指令 %segreg:disp(base,index,scale),foo

mov eax,[ebx+20h]

Movl 0x20(%ebx),%eax

add eax,[ebx+ecx*2h]

Addl (%ebx,%ecx,0x2),%eax

lea eax,[ebx+ecx]

Leal (%ebx,%ecx),%eax

sub eax,[ebx+ecx*4h-20h]

Subl -0x20(%ebx,%ecx,0x4),%eax

“l”表示长整数(32位),“w”表示字(16位),“b”表示字节(8位)。而在Intel的语法中,则要在内存单元操作数的前面加上byte ptr、 word ptr,和dword ptr,“dword”对应“long”。

Intel语法
AT&T语法
Mov al,bl

movb %bl,%al

Mov ax,bx

movw %bx,%ax

Mov eax,ebx

movl %ebx,%eax

Mov eax, dword ptr [ebx]

movl (%ebx),%eax

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: