寻址方式
与数据有关的寻址方式
1.立即寻址方式
例如:
- MOV AL,20
- MOV AX, 1234H
2.寄存器寻址
例如:
- MOV AL,BX
3. 存储器操作数寻址
3.1. 直接寻址方式
- 物理地址=(DS)*10H+EA=(段基址的寄存器)*10H+偏移地址
- 例如
- 已知DS=4000, [2000H]=3355H
- mov AX, [2000H]
- 执行后:AX=3355H
- 物理地址=40000H+2000H=42000H,EA=2000H
3.2. 寄存器间接寻址
- 指令有效地址(EA)放在BX,SI,DI寄存器中,则操作数在数据段中,即操作数的物理地址为
- 物理地址=(DS)*10H+{(BX)(SI)(DI)}
- 若有效地址存放在BP寄存器中,则操作数在堆栈段中,即操作数物理地址为
- 物理地址=(SS)*10H+(BP
- 可使用段跨越前缀来取得其他段中的数据,如:
- MOV AX,EX:[BX]
寄存器相对寻址方式
- 以BX、SI、DI为基址
- 物理地址=(DS)*10H + {(BX)(SI)(DI)}+8位位移量或16位位移量
- 以BP作为基址
- 物理地址=(SS) * 10H + (BP) + 8位位移量或16位位移量
基址变址寻址方式
- 物理地址=(DS)* 10H + (BX) +{(SI)(DI)}
- 物理地址=(DS) * 10H + (BP)+{(SI)(DI)}
相对基址变址寻址方式
- 物理地址=(DS)* 10H + (BX) +{(SI)(DI)}+ 8位位移量或16位位移量
- 物理地址=(DS) * 10H + (BP)+{(SI)(DI)}+ 8位位移量或16位位移量
与转移地址有关的寻址方式
段内直接寻址
- 段内直接寻址转移的有效地址是当前IP寄存器内容和指令中指定的8位或16位位移量之和
- 当偏移量为8位时,称为短转移
- 例如
- JMP SHORT NEXT
- NEXT 表示转移的符号地址
- 操作符SHORT表示偏移量是个8位的带符号数,数据范围为80H–7FH
- 当偏移量为16位时,则在符号地址前加操作运算符NEAR PTR
- 例如
- JMP NEAR PTR PROGA
- PROGA表示转移的符号地址
- 操作符NEAR PTR表示偏移量是16位带符号数,数值范围位8000H–7FFFH
- 当偏移量为8位时,称为短转移
段内间接寻址
- 段内简介寻址转移地址的有效地址是一个寄存器的内容或存储单元的内容。存储单元内容可以用在与数据有关的寻址方式中寻找存储器操作数的任何一种寻址方式取得。用所取得的有效地址代替IP寄存器的内容
- 例如
- JMP BX
- 执行前,BX=2010H, IP = 2050H
- 执行后,BX=2010H, IP = 2010H, 程序转移到偏移量2010H处继续执行
- JMP WORD PTR TABLE[BX]
- 或 JMP TABLE[BX]
- 已知,DS = 2000H, BX = 2150H, TABLE=2060H,IP=2100H,则操作数存储单元的物理地址
=DS*10H+TABLE+BX - 执行前,IP = 2100H, (241B0H)=50H,(241B1H) = 30H
- 执行后, IP = 3050H
- 注:TABLE必须由伪指令赋值或定义。
- 已知,DS = 2000H, BX = 2150H, TABLE=2060H,IP=2100H,则操作数存储单元的物理地址
段间直接寻址
- 段间直接寻址指令中提供了转移地址的段地址和偏移地址,所以只要用指令中指定的偏移地址取代IP寄存器内容,用指令指定的段地址取代CS寄存器的地址,就完成了从一个代码段到另一个代码段的转移操作
- JMP FAR PTR TARGET
- TARGET是转移地址的符号地址
- FAR PTR表示段间转移操作符
段间间接寻址
- 段间间接巡展之用存储器的两个相继字(4个字节单元)的内容来取代IP和CS寄存器中的内容,已达到段间转移的目的。
- JMP DWORD PTR [BX
- DWORD PTR为双字操作符,说明转移地址需要取双字为段间转移。
- [BX]表示双字转移地址是在寄存器间接寻址方式寻找的存储器的4个相继存储单元中。
- 例如:DS = 3000H,BX=1200H,则物理地址=30000+1200=31200H
- 指令执行前:CS=0000H,IP=1000H,(31200H)=40H,(31201H)=01H,(31202H)=00H,(31203H)=10H.
- 指令执行后,CS = 1000H,IP=0140H
I/O端口寻址
1.直接端口寻址方式
- I/O端口地址以8位立即数方式在指令中直接给出。
- IN AL,PORT
- PORT位寻址端口编号,只能在0~255范围之间
2.间接端口间接寻址方式
- I/O地址超过8位时,应放在DX寄存器中,即通过DX间接寻址,所能寻址的端口编号为0~65535.如,OUT DX,AL。表示将AL的内容输入到由(DX)指定的端口中去。
8086/8088指令系统
1.数据传送指令
通用数据传送指令
- MOV指令
- 格式: MOV DST,SRC
- 操作:(DST)<-(SRC),把源操作数的内容送给目的操作数
- 注:MOV不允许两个存储器单元传送数据
- MOV不允许在两个段寄存器之间传送数据
- 交换命令
- 格式:XCHG OPR1,OPR2
- 操作:OPR1<=>OPR2
累加器专用传送指令
- 输入指令
- 格式1:
- IN AL,PORt :字节输入
- IN AX,PORT :字输入
- 格式2
- IN AL,DX, :字节输入 (AL)<- [(DX)]
- IN AX,DX :字输入 (AX)<-[(DX)+1,(DX)]
- 格式1:
- 输出指令
- 格式1:
- OUT PORT,AL :字节输出
- OUT PORT,AX :字输出
- 格式2:
- OUT DX, AL
- OUT DX, AX
- 格式1:
- I/O两指令两种格式取决于外部设备端口地址的宽度。
算数运算指令
1.加法指令
- ADD
- 格式:ADD DST,SRC
- 操作(DST)<-(DST)+(SRC)
- ADC(带进位加法指令)
- 格式:ADC DST,SRC
- 操作(DST)<-(DST)+(SRC)+(CF)
- INC加1指令
- 格式:INT DST
2.减法指令
- SUB
- SBB带借位的减法
- 格式:SBB DST,SRC
- 操作:(DST)<-(DST)-(SRC)-(CF)
- DEC减1指令
逻辑指令操作
1.逻辑指令
- AND
- 格式:AND DST, SRC
- 操作(DST)<- (DST)∧(SRC)
- OR
- NOT
- 格式:NOT DST
- 操作:(DST)<-(!dST)
- TEST测试指令
- 格式:TEST OPR1 ,OPR2
- 操作:(DST)∧(SRC),结果不保存
程序控制指令
1.无条件转移指令 JMP
2.条件转移指令
- 无符号数比较转移指令
- JC/JB/JNAE CF=1
- 有符号数比较转移指令
- 单个标志位判断转移指令
3.循环指令
- LOOP OPR