80x86汇编语言寻址方式介绍
程序员文章站
2024-02-02 18:22:58
...
80x86汇编语言寻址方式介绍
立即数寻址
操作数直接包含在指令代码中,可以是8或者16位。立即数作为指令的一部分,直接从BIU指令队列取出,因此速度更快。唯一缺点:只能作为源操作数。
寄存器寻址
指令中所需的操作数在CPU某个寄存器中,可以是8位/16位段寄存器,这个操作完全在CPU内部,因此执行也很快。
以下指令需要CPU以外的东西参与
一个存储单元逻辑地址:段基址:偏移量
段基址由某个段寄存器提供,偏移量也叫有效地址EA(存储单元到基址的距离)
直接寻址
用符号或者常数表示
mov bx,var;mov bx,DS:var or mov bx,DS:var+0
mov bx,DS:[64H];常数表示要用方括号括起来,段寄存器不能省略。
寄存器间接寻址
事先将偏移量放在某个寄存器中(BX/BP/SI/DI),如同一个地址指针。指示寄存器所在段的段寄存器可以省略,指令中使用的是BP则隐含使用SS,否则隐含使用DS
mov ax,[bx];mov ax,ds:[bx]
mov bh,[bp];mov bh,ss:[bp]
为什么这么规定呢?
BP是栈帧寄存器,子程序用它获取主程序传来的参数。很多子程序都使用堆栈传参,所以非常有用。这也是BP最常见的用途,所以干脆规定:BP默认就是跟SS联用的。
基址/变址寻址
EA=基址分量/变址分量+指令中给出的位移量
指令中使用BX/BP为基址寻址,使用SI//DI为变址寻址
隐含使用规则相同
mov ax,10h[si];mov ax,ds:10h[si]
mov table[di],al;mov ds:table[di],al;位移量为常数不能加方括号
这两种寻址方式只需要通过改变寄存器内容就可以用一条指令访问不同的存储单元,由于增加了一个位移量数据,因此能够很方便访问数组和表格数据。
基址变址寻址
这是三个地址分量的和。
EA=基址+变址+偏移量
基址选用BX时隐含使用DS,选用BP时选用SS。
基址BX/BP二选一,变址SI/DI二选一方便访问二维数组
串操作寻址方式
隐含使用SI/DI
寻找源操作数用SI,目的操作数用DI
传操作完成后会自动修改SI和DI,指向下一个操作数
I/O端口寻址
IN/OUT指令
直接端口寻址
如
in al,25h;
间接端口寻址
先送端口地址到DX