在立即数寻址(或立即寻址)方式中,指令需要的操作数紧跟在操作码之后作为指令机器代码的一部分,并随着处理器的取指操作从主存进入指令寄存器。这种操作数用常量形式直接表达,从指令代码中立即得到,称为立即数(Immediate)。立即数寻址方式只用于指令的源操作数,在传送指令中常用来给寄存器和存储单元赋值。
例如,将数据33221100H传送到EAX寄存器的指令可以书写为:
这个指令的机器代码(十六进制)是B8 00 11 22 33,其中头一个字节(B8)是操作码,后面4个字节就是立即数本身:33221100H。IA-32处理器采用小端存储方式,规定:数据高字节存放于存储器高地址单元,数据低字节存放于存储器低地址单元,如图2-10所示。
图2-10 立即数寻址
[例2-8]立即数寻址程序
本示例程序的代码段中,所有MOV指令的源操作数均采用立即数寻址方式,立即数寻址方式也只能用于源操作数。它们尽管有多种形式,但汇编后都是一个确定的数值,即立即数,列表文件中紧跟着操作码的就是计算机内部对这些立即数的编码。
前5条指令使用常量的不同形式表达立即数,依次是十六进制常数、字符(实际上就是ASCII码值)、十进制负数(内部采用补码)、符号常量(表示其等价的数值)和表达式(其中还使用了类型操作符)。
用地址操作符OFFSET获得变量地址,也是立即数寻址。标号LABL也有地址属性,指令直接使用它表示其偏移地址(也可以加上OFFSET操作符)。例2-7中的源操作数(除第一条指令外)也都采用立即数寻址方式。
也可以将立即数传送给变量,后面两条MOV指令就是如此。
注意,立即数(常量)没有类型,它的类型取决于另一个操作数的类型。寄存器依其名称具有明确的类型。所以,代码段中第一条MOV指令的8位寄存器AL确定“12H”是一个字节量,指令进行8位数据传送。MASM汇编程序定义的变量保有其定义时的类型,因此变量BVAR是8位字节类型、DVAR是32位双字类型。为了更清晰地表示变量的类型,或者如果需要转换变量类型,可以在变量前使用类型符。所以,BVAR前使用了BYTE类型符,DVAR前使用了DWORD类型符。因此,最后一条MOV指令的“12H”是双字量(前导0被省略了)。程序最后利用子程序DISPRD显示寄存器值,以对比读者判断的结果。