
AT&T-GCC 汇编指南
1.寄存器引用
引用寄存器要在寄存器号前加百分号%,如"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).
2. 操作数顺序
操作数排列是从源(左)到目的(右),如"movl %eax(源), %ebx(目的)"
3. 立即数
使用立即数,要在数前面加符号$, 如"movl $0x04, %ebx"
或者:
para = 0x04
movl $para, %ebx
指令执行的结果是将立即数 04h 装入寄存器 ebx.
4. 符号常数
符号常数直接引用 如
value: .long 0x12a3f2de
movl value , %ebx
指令执行的结果是将常数 0x12a3f2de 装入寄存器 ebx.
引用符号地址在符号前加符号$, 如"movl $value, % ebx"则是将符号 value 的地址
装入寄存器 ebx.
5. 操作数的长度
操作数的长度用加在指令后的符号表示 b(byte, 8-bit), w(word, 16-bits),
l(long, 32-bits),如:
movb %al, %bl
movw %ax, %bx
movl %eax, %ebx