|  | 
 
 发表于 2022-8-23 20:22:53
|
显示全部楼层 
| 遍寻无址——容承烈介绍几种方式: 
 1、直接寻址(Direct Addressing Mode)。只使用ADDRESS_OR_OFFSET寻址,例如movl ADDRESS, %eax把ADDRESS地址处的32位数传送到eax寄存器。
 
 2、变址寻址(Indexed Addressing Mode) 。上一节的movldata_items(,%edi,4), %eax就属于这种寻址方式,用于访问数组元素比较方便。
 
 3、间接寻址(Indirect Addressing Mode)。只使用BASE_OR_OFFSET寻址,例如movl(%eax), %ebx,把eax寄存器的值看作地址,把这个地址处的32位数传送到ebx寄存器。注意和movl %eax, %ebx区分开。
 
 4、基址寻址(Base Pointer Addressing Mode)。只使用ADDRESS_OR_OFFSET和BASE_OR_OFFSET寻址,例如movl4(%eax), %ebx,用于访问结构体成员比较方便,例如一个结构体的基地址保存在eax寄存器中,其中一个成员在结构体内的偏移量是4字节,要把这个成员读上来就可以用这条指令。
 
 5、立即数寻址(Immediate Mode)。就是指令中有一个操作数是立即数,例如movl $12, %eax中的$12,这其实跟寻址没什么关系,但也算作一种寻址方式。
 
 6、寄存器寻址(Register Addressing Mode)。就是指令中有一个操作数是寄存器,例如movl$12, %eax中的%eax,这跟内存寻址没什么关系,但也算作一种寻址方式。在汇编程序中寄存器用助记符来表示,在机器指令中则要用几个Bit表示寄存器的编号,这几个Bit也可以看作寄存器的地址,但是和内存地址不在一个地址空间。
 
 | 
 |