数据寻址方式
立即数寻址
操作数直接存放于指令
1 | MOV AX,1234H ;即1234H |
寄存器寻址
操作数存放于 CPU 的某个寄存器中,不需访问存储器速度快
8 位操作数寄存器可以是 AH AL BH BL CH CL DH DL
16 位操作数寄存器可以是 AX BX CX DX SP BP SI DI
1 | MOV AX,BX |
存储器直接寻址
数据在存储器中,存储单元的有效地址(即偏移地址 EA)由指令直接给出。计算机通过段基址和有效地址获得物理地址(左移四位 + 偏移量balabala),段基址默认为 DS 数据段
允许段跨越前缀和符号地址
1 | MOV AX,[100H] |
寄存器间接寻址
操作数在存储器中,寄存器的内容作为操作数的有效地址
所有间接寻址中,仅可使用 BX BP SI DI,其中 BP 默认段是 SS 的堆栈段,其余为 DS 的数据段
允许段跨越前缀和符号地址
1 | MOV AX,[SI] |
寄存器相对寻址
操作数的有效地址是一个基址寄存器(BX/BP)或变址寄存器(SI/DI)内容与指令中指定的 8/16 位偏移量之和
允许段跨越前缀和符号地址
1 | MOV AX,100H[SI] |
基址变址寻址
操作数的有效地址是一个基址寄存器的内容加上一个变址寄存器的内容,与 DS/SS 的内容组合为物理地址,BX 默认段则为 DS,BP 默认段则为 SS,适用于数组或表格处理,首地址存放在基址寄存器中,用变址寄存器访问数组的元素
允许段跨越前缀
1 | MOV AX,[BX][DI] |
相对基址变址寻址
基址变址寻址的基础上再加一个指令中的 8/16 位位移量,适用于二维数组,偏移量指向文件首,基址寄存器指向某记录,变址寄存器指向记录中的元素
允许段跨越前缀和符号地址
1 | MOV AX,MASK[BX][SI] |
程序转移寻址方式
程序的执行由指令的地址指针(CS 和 IP)决定,IP 的内容会自动改变指向下一条指令的地址,若需要改变程序的执行顺序,需要修改 IP CS 的内容;段内转移仅改变 IP 地址,段间转移因为不在同一个代码段同时要改变 CS 的值
段内直接寻址
转向的有效地址是相对于当前 IP 值的 8/16 位位移量,即 IP 寄存器内容与指令中指定的位移量之和,使用于条件转移和无条件转移
用于条件转移指令时位移量仅允许 8 位,用于无条件转移指令时,8 位称短跳转,16 位称近跳转
1 | JMP SHORT ADDR2 ;短跳转 |
段内间接寻址
转向的有效地址是一个寄存器或一个存储单元的内容,通过除立即数寻址以外的任何寻址方式获得,然后取代 IP 寄存器的内容
1 | JMP BX |
段间直接寻址
在指令中直接提供转向地址和偏移地址,分别取代 CS 和 IP 寄存器的内容
FAR PTR 段间转移操作符,允许符号地址
1 | JMP FAR PTR ADDR |
段间间接寻址
用存储器中两个相继字的内容取代 IP 和 CS 的内容,通过除立即数寻址和寄存器寻址以外的任何寻址方式获得,有效地址的第一个字作为转移偏移地址送 IP 寄存器,第二个字节作为转移段地址送 CS 寄存器
1 | JMP DWORD PTR [ADDR+BX] |