汇编语言寻址方式(Linux)

时间:2022-05-26 01:18:25

地址引用通用格式

地址或偏移(%基地址寄存器,%索引寄存器,比例因子)
计算结果=地址或偏移 + %基地址或偏移量寄存器 + 比例因子 * %索引寄存器

其中所有字段都是可选的。具体如何省略的,会在后面说明。注意,蓝色代表使用,绿色代表保被省略的部分。

直接寻址方式:

movl 0x1234, %eax
通式分解:地址或偏移(%基地址寄存器,%索引寄存器,比例因子)
直接将0x12345(16进制地址)中保存的值存到寄存器eax中(单位字节,因为没有设置比例因子)

立即数寻址

movl $0x1234, %eax
通式分解:地址或偏移(%基地址寄存器,%索引寄存器,比例因子)
在这里特意用了一个跟直接寻址很类似的格式表述。目的是为了区分立即数寻址和直接寻址。其实两条命令很像,在立即数寻址中,会在数字前多加一个$美元符号。这条命令执行的是将0x1234这个数字存到寄存器eax中去,单位是两个字节

间接寻址

movl (%eax), %ebx
通式分解:地址或偏移(%基地址寄存器,%索引寄存器,比例因子)
根据寄存器eax中保存的值作为间接寻址中的地址寻找值。举个例子,假如说eax中存的值是0x1234,那么这条指令的工作是将0x1234内存地址中保存的值存到eax中。

基址寻址

movl 4(%eax), %ebx
通式分解:地址或偏移(%基地址寄存器,%索引寄存器,比例因子)
可以参考间接寻址,其实就是在间接寻址的基础上,再多了一个4个字节大小的偏移。依然假设eax中的值为0x1234,命令执行的其实是将0x1234+4=0x1238内存地址中保存的值存到寄存器ebx里

索引寻址

movl string(, %ecx, 1), %ebx
通式分解:地址或偏移(%基地址寄存器,%索引寄存器,比例因子)
根据通式可知,取值地址=string指向的地址+%ecx * 1。string一般标注着数据开始的字段。

寄存器寻址

movl %eax, %ebx
通式分解:地址或偏移(%基地址寄存器,%索引寄存器,比例因子)
这个也是最常见的,基本不用解释。将eax寄存器里的数据存到ebx中