AT&T寻址方式
最近在看AT&T汇编,由于跟Intel汇编还有些许区别,所以对一些寻址方式稀里糊涂的,去网上查阅发现几乎都是一个模子的,自己参考总结了一下。为了方便记忆,就对照着Intel的寻址方式,结合着自己的理解总结的,可能有些地方和官方略有不同。
参考:https://blog.csdn.net/kuaizaifeng_1991/article/details/75807676
基本公式:相对地址(%基址寄存器,%变址寄存器,比例因子)
1.立即数寻址
movl $2, %ebx
将立即数2放入ebx寄存器中
2.直接寻址
movl 0x8000, %eax
将地址为0x8000的内容放入ebx寄存器中
3.寄存器间接寻址
# 假如ebx寄存器中已存放了0x8000
movl %ebx, %eax
将寄存器ebx中的内容0x8000作为地址,再将地址为0x8000的内容放入eax寄存器中
4.寄存器相对寻址
# 假如ebx寄存器中已存放了0x8000
movl 2(%ebx), %eax
将地址为0x8002(2+0x8000,2为相对地址,是一个常量;ebx中存放的内容是为基址,是一个变量)的内容放入eax寄存器中
5.基址变址寻址
# 假如ebx寄存器中已存放了0x8000,eax寄存器中已存放了0x4
movl (%ebx, %eax), %ecx
将地址为0x8004(0x8000 + 0x4,ebx中存放的内容是为基址,是一个变量;eax中存放的内容为变址,是一个变量)的内容放入ecx寄存器中
# 假如ebx寄存器中已存放了0x8000,eax寄存器中已存放了0x4
movl 2(%ebx, %eax), %ecx
将地址为0x8006(2 + 0x8000 + 0x4,2为相对地址,是一个常量;ebx中存放的内容是为基址,是一个变量;eax中存放的内容为变址,是一个变量)的内容放入ecx寄存器中
6.比例基址变址寻址
# 假如ebx寄存器中已存放了0x1000
movl ( , %eax, 4), %ecx
将地址为0x4000(0x1000 * 4,eax中存放的内容为变址,是一个变量;4为比例因子)的内容放入ecx寄存器中
# 假如ebx寄存器中已存放了0x1000,eax寄存器中已存放了0x2000
movl (%ebx, %eax, 4), %ecx
将地址为0x6000(0x2000 + 0x1000 * 4,ebx中存放的内容是为基址,是一个变量;eax中存放的内容为变址,是一个变量;4为比例因子)的内容放入ecx寄存器中
# 假如ebx寄存器中已存放了0x1000,eax寄存器中已存放了0x2000
movl 2(%ebx, %eax, 4), %ecx
将地址为0x6002(2 + 0x2000 + 0x1000 * 4,2为相对地址,是一个常量;ebx中存放的内容是为基址,是一个变量;eax中存放的内容为变址,是一个变量;4为比例因子)的内容放入ecx寄存器中