计算机系统之汇编---IA32处理器数据格式及数据操作
IA32数据格式:
Intel用术语“字”表示16位数据类型,因此,称32位数为“双字”,称64位数为“四字”。
Char*这里指的是所有指针类型,注意:c语言新增加的long long是八字节,但是硬件IA32不支持这个类型。
寄存器(8个32位的寄存器,均以%e开头)
%eax、%ecx、%edx:调用者保存(数据)寄存器,当过程p调用q,q可以覆盖这些寄存器,但是不会改变p中的数据。
%ebx、%esi、%edi:被调用者保存(数据)寄存器,当过场p调用q,q必须在覆盖这些寄存器数据前,要把它们保存到栈,
并在调用结束返回时恢复它们,这些数据p或其他过程需要它们。
%esp、%ebp:有关栈指针的
大多数指令有一个或多个操作数,指示出执行一个操作中要引用的源数据值,以及放置结果的目标位置。源数据值可以以常数形式给出,或从寄存器或存储器中读出,结果可以保存放在寄存器或存储器中。
操作数分三种:
>>>1. 立即数即常数,用$开头,后面加一个整数表示;
>>>2. 寄存器数,对字操作而言表示某个寄存器中的保存的值;对字节操作而言是8个单字节寄存器中的 一个,比如:%al(eax寄存器中的低8位)
>>>3. 存储器引用,根据计算出的有效地址来访问存储器的某个位置;包括四部分:立即数偏移(lmm)、基址寄存器 Eb、变址寄存器 Ei、比例因子s。 有效地址被计算为 Imm + R[Eb] + R[Ei] * s。 (R[Eb]表示寄存器Eb的值,R[Ei]表示寄存器Ei的值,s的值只能是1,2,4或者8) 下表中Mb[addr] 表示对存储器在存储器中从地址addr开始的b个字节值的引用。
有关操作数格式表
例如:地址0x100的值是56,那么操作数0x100的值就是56,属于绝对寻址;$0x100的值0x100,是立即数寻址;