ASM16-8~10 --寻址方式
ASM16
x86指令编码(硬编码)的结构
opcode最少1个字节,最多3个字节。
opcode是指令中最重要的组成部分。
前缀指令只能影响自己,而opcode、ModR/M、SIB决定了整条指令的长度。
有没有ModR/M是由opcode决定的,有没有SIB是由ModR/M决定的。
指令长度:
变长指令 复杂指令集 (intel amd):仅仅通过opcode是没有办法确定长度的。
定长指令 精简指令集 (arm):它的长度永远没有变化,只要opcode的长度确定了,那么它的长度就确定了。
精简指令集:
这种 CPU 的设计中,微指令集较为精简,每个指令的运行时间都很短,完成的动作也很单纯,指令的执行效能较佳; 但是若要做复杂的事情,就要由多个指令来完成。
复杂指令集:
与精简指令集不同的,CISC复杂指令集在微指令集的每个小指令可以执行一些较低阶的硬件操作,指令数目多而且复杂, 每条指令的长度并不相同。因为指令执行较为复杂所以每条指令花费的时间较长, 但每条个别指令可以处理的工作较为丰富。
比较:
CPU架构 | 特性 |
---|---|
复杂指令集 | 指令多且复杂、执行时间较长、功能丰富 |
精简指令集 | 指令执行时间短、完成动作单纯、效能较佳 |
如何区分指令定长还是变长?
opcode后面没有ModR/M,该指令就是定长指令。如果opcode后面紧跟ModR/M,该指令就是变长指令
1 | 操作码(1字节) 寻址方式 操作数 |
立即数寻址方式
指令中的操作直接存放在机器代码中,紧跟在操作码之后(操作数作为指令的一部分存放在操作码之后的主存单元中)
这种操作数被称为立即数imm
- 它可以是8位数值i8(00H~FFH)
- 也可以是16位数值i16(0000H~FFFFH)
立即数寻址方式常用来给寄存器赋值
立即数寻址方式常用来给寄存器赋值
1
2mov al,ff
mov ax,ffff
立即寻址方式的优缺点:
优点:指令已经提供操作数,无需再次访问存储器。提供操作数最快。
缺点
①操作数为指令一部分,不能修改,适用于给某一寄存器或存储单元赋初值等操作。
②指令中A的位数限制了这类指令所表述的立即数的范围。
寄存器寻址方式
- 操作数存放在CPU的内部寄存器reg中,可以是:
- 8位寄存器r8:AH、AL、BH、BL、CH、CL、DH、DL
- 16位寄存器r16:AX、BX、CX、DX、SI、DI、BP、SP
- 4个段寄存器seg:CS、DS、SS、ES
寄存器间接寻址方式
有效地址存放在基址寄存器BX或变址寄存器DI中
默认的段地址在DS段寄存器,可使用段超越前缀改变
直接寻址方式
- 有效地址在指令中直接给出
- 默认的段地址在DS段寄存器,可使用段超越前缀改变
寄存器相对寻址方式
有效地址是寄存器内容与有符号8位或16位位移量之和,寄存器可以是BX、BP或SI、DI
有效地址=BX/BP/SI/DI+8/16位位移量
1
2
3
4
5
6
7
8
- 段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可用段超越前缀改变
```c
mov 寄存器,[寄存器+偏移量值]
mov 寄存器,ds:[寄存器+偏移量值]
mov [寄存器+偏移量值],寄存器
mov ds:[寄存器+偏移量值],寄存器
基址变址寻址方式:
有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成:
有效地址=BX/BP+SI/DI
1
2
3
4
5
6
7
8
9
10
11
12
- 段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变
**相对基址变址寻址方式**
偏移地址值通过[基址寄存器+变址寄存器+偏移量值]的形式运算后获得。
```c
mov 寄存器,[基址寄存器+变址寄存器+偏移量值]
mov [基址寄存器+变址寄存器+偏移量值],寄存器
存储器寻址: