访问信息
熟识汇编的朋友一定知道,CPU指令是通过寄存器和存储器交互来完成的。
IA32 CPU包含一组存储32位值的寄存器。%eax,%ecx,%edx,%ebx,%esi,%edi,%esp和%ebp。如图所示。
这些寄存器用来存储整数数据和指针。
大多数情况下,前6个寄存器都可以看成通用寄存器。对他们的使用没有限制。另外对前3个寄存器(%eax,%ecx,%edx)的保存和恢复惯例不同于接下来的三个寄存器(%ebx,%edi和%esi)。最后两个寄存器(%ebp和%esp)保存着指向程序栈中重要位置的指针。只有根据栈管理的标准惯例才能修改这两个寄存器中的值。
如上图所示,字节操作可以独立的读或者写前4个寄存器的2个低位字节。类似的,字操作指令可以读或者写每个寄存器的低16位。
操作数指示符
大多数指令都有一个或多个操作数,指示出执行一个操作中要引用的源数据值以及放置结果的目标位置。IA32支持多种操作数格式。主要可分为三类。一 立即数。也就是常数值。用“$”后面跟标准c表示的整数。二 寄存器。表示某个寄存器的内容。三 存储器。根据计算的地址访问某个存储器位置。
如图所示,有多种不同的寻址模式。允许不同形式的存储器引用。Imm(Eb,Ei,s)其由4部分组成。立即数偏移Imm,一个基地址寄存器Eb,一个变址寄存器Ei和一个比例因子s。s可为1,2,4,8。有效地址的计算公式为Imm+R[Eb]+R[Ei].s。
数据传送指令
将数据从一个位置复制到另一个位置的指令是最频繁使用的指令。
mov类中的指令将源操作数的值复制到目的操作数中。源操作指定的值是一个立即数,存储在寄存器中或者存储器中。目的操作数指定一个位置要么是一个寄存器,要么是一个存储器地址。IA32加了一条限制,传送指令的两个操作数不能都指向存储器位置。
movs,movz指令都是将一个较小的源数据复制到较大的数据位置。高位用符号扩展或者零扩展进行填充。