寻址方式
所谓寻址,指的是寻找操作数的地址或是下一条将要执行的指令地址。
寻址方式是指如何确定一条将要执行指令的地址及指令中操作数地址的方式,
可以分为指令寻址和数据寻址。
指令寻址
1)顺序寻址 (PC)+1-> PC
2) 跳跃寻址 有转移类指令提供下条指令地址
数据寻址
数据寻址方式是根据指令中给出的地址码字段寻找真实操作数地址的方式。通常将指令地址码字段中的地址称为形式地址(用字母A表示),操作数的真实地址称为有效地址(用字母EA表示)。
(1)立即数寻址
操作数就包含在指令中,操作数=A
(2)直接寻址
操作数在存储器中,EA=A
(3)间接寻址
操作数在存储器中,操作数的地址也保存在存储器中,EA=(A)
(4)寄存器寻址
操作数在寄存器中,指令的地址码字段直接指出寄存器号Ri,EA=Ri
(5)寄存器间接寻址
操作数在存储器中,操作数的地址保存在寄存器中,EA=(Ri)
(6)隐含寻址
操作数隐含在累加器ACC中,在指令中无需地址码指出该操作数。
(7)偏移寻址
操作数在存储器中,操作数的地址需要通过计算得到。根据所选寄存器的不同,偏移寻址可以分为 相对寻址、基址寻址和变址寻址。
(a)相对寻址 EA=(PC)+A
(b)基址寻址 EA=(基址寄存器)+A
(c ) 变址寻址 EA=(变址寄存器)+A
(8)堆栈寻址
堆栈是存储器中的一段特殊存储空间。操作数存放在栈顶中,指令中无需地址码,操作数的有效地址由栈顶指针SP指示。
x86-64的操作数指示符和寻址方式
x86-64支持多种操作数格式。 源数据值可以以常熟形式给出, 或者从寄存器或内存中读出, 结果可以存放在寄存器或者内存中。 因此,各种不同的操作数的可能性被分为三种类型。
第一种类型是立即数, 用来表示常熟值。在ATT格式的汇编代码中, 立即数的书写方式是‘$’后面跟一个用标准C表示法表示的整数, 比如,$-577,或$0x1F。不同的指令允许的立即数值范围不同,汇编器会自动选择最紧凑的方式进行数值编码。
第二种类型是寄存器, 它表示某个寄存器的内容, 16个寄存器的低位1字节、2字节、4字节、8字节中的一个作为操作数, 这些字节数分别对应于8位、16位、32位或64位。用符号
来表示任意寄存器a, 用引用
来表示它的值,这是将寄存器集合看成一个数组R, 用寄存器标识符作为索引。
第三类型是内存引用, 它会根据计算出来的地址(通常称为有效地址)方位某个内存位置。因为将内存看成一个很大的字节数组,用符号
表示对存储在内存中从地址Addr开始的b个字节值的引用。 为了简便,通常省去下标b。
