一个IA32的cpu包含八个存储32位值的寄存器。这些寄存器可以用来存储寄存器和指针。每个寄存器一%开头,如下图所示:
大多情况下,前六个可以看作通用寄存器,多他们没有特别的使用限制。最后两个保存着指向程序最重要的两个指针。栈指针和帧指针(基址指针)。
操作数指示符
1 立即数,也称常数,在ATT汇编代码中用 '$'后面跟一个标准C表示的常数。如:$ox1F;
2 寄存器,表示某个寄存器的内容,对双字操作来说,可以是8个32位寄存器其中一个如:%eax; 对单字操作来说,可以表示8个16位寄存器其中的一个如:%ax,对字节操作来说,可以表示8个8位寄存器其中的一个:%ai;
3 存储器,他会根据计算出来的地址访问,访问某个存储器位置。如;4(%eax),表示访问 %eax + 4 这个地址的内容。
上图所示,是操作数指示符的一些操作。
数据传送指令:
movb:移动一个byte
movw:移动一个字(2byte)
movl:移动双字 (4byte)
movl $0x12F %eax immediate -> register 4bytes
movw %bp %sp register -> register 2bytes
movb (%edi,%ecx) %ah memmory -> register 1byte
movl $0x12 4(%eax) immediate -> memory 4bytes
-------------------------------------------------------------
pushl: 把数据压入栈顶,指令只有一个操作数,动作为:先把栈指针减四4(栈向低地址扩展),然后把值写到新的栈顶地址
如在函数调用的时候经常看到的 pushl %ebp,其行为等价于下面两条:
subl $0x4 %esp
movl %ebp (%esp)
popl:把数据弹出栈顶,指令也只有一个操作数,动作:先把栈顶值读出,然后栈指针加4
如 popl %eax 其行为等价于下面两条指令;
movl (%esp) %eax
addl $0x4 %esp
加载有效地址指令 lean
如: lean (%eax) %ecx
表面上看上去是将存储器的内容传给%ecx,实际上根本没有用到存储器引用,而是把有效地址加载给%ecx,即 把%eax -> %ecx;
淡然还有其他的整数算数操作,如下图: