【上节重点】
BX 指BX的地址
[BX]指BX中的内容
8086指令系统功能
数据传送
算术运算
逻辑运算和移位
串操作
程序控制
处理器控制
数据传送
通用数据传送
输入输出
地址传送
标志位操作
通用数据传送【该类指令的执行对标志位不产生影响】
一般数据传送指令
堆栈操作指令
交换指令
查表转换指令
字位扩展指令
一般数据传送指令 MOV
格式 :MOV dest,src
操作:将src传到dest中
例子:MOV AL,BL
【注】
两操作数字长必须相同 【AL八位 BX十六位 位数不一致】
两操作数不允许同时为存储器操作数【[1200H]和[SI] 都是存储器】
两操作数不允许同时为段寄存器
源操作数src是立即数时,目标操作数不能是段寄存器【DS 1000H 不能把立即数直接传给段寄存器CS DS ES SS】
IP和CS不作为目标操作数dest,FLAGS一般也不作为操作数在指令中出现
堆栈操作指令
堆栈概念:栈顶 栈首 栈底
先进后出 以字为单位
SP:堆栈指针指字中的低位
堆栈中的字的末地址只要说高位就可
操作数高字节=SP+1
操作数低字节=SP
压栈指令PUSH 【SP值-2】
格式:PUSH OPRD【16位寄存器或存储器两个单元 OPRD就是存进去的内容】
出栈指令POP【SP值+2】
格式:POP OPRD【16位寄存器或存储器两个单元 OPRD就是存进去的内容】
【注】
指令的操作数必须是16位的【以字为操作单位】
操作数可以是寄存器或存储器两单元,但不能是立即数【立即数要先MOV给寄存器再操作】
不能从栈顶弹出一个字给CS
PUSH 和POP 一般成堆出现而且最近的两两配对
PUSH从高到低,POP从低到高
交换指令
格式:XCHG REG MEM/REG
例子:XCHG AX, BX
XCHG [2000],CL
【注】
两操作数中必须由一个是寄存器操作数
不允许使用段寄存器【DS CS SS】或立即数
不允许同时为两个存储器
换码指令(查表指令)
格式:XLAT
操作:将BX+AL所指单元的内容送到AL
BX内容表示表格首地址,AL内容为表内位移量 BX+AL是要查元素的偏移地址,
例子:
MOV BX,2000H
MOV AL,0BH
XLAT
输入输出指令
专门面向I/O端口操作的指令
输入指令:IN acc,PORT
输出指令:OUT PORT,acc【PORT为端口地址】
指令寻址方式
直接寻址
端口地址为8位,指令中直接给出8位端口地址
寻址256个端口
间接寻址
端口地址为16位,指令中的端口地址必须由DX指定,立即数要先MOV 到DX
可以寻址64k个端口
I/O指令例
IN AX ,80H【直接寻址】
MOV DX,2400H 立即数要先MOV 到DX
IN AL,DX
OUT 35H,AX
OUT AX,35H【自动到00350H和00351H? PPT-65】
地址传送指令:传送偏移地址
1 取偏移地址指令LEA
2 地址指针传送指令
(1)指针送寄存器和DS指令LDS
(2)指针送寄存器和ES指令LES
取偏移地址指令LEA
将变量的16位偏移地址取出送目标寄存器
当程序中用符号地址表示内存偏移地址时,必须使用LEA
格式: LEA REG,MEM
要求:源操作数必须是一个存储器操作数,目标操作数通常是一个间址寄存器
【例】
MOV SI,DATA1
传输结果是DATA1本身的地址,不是DATA1的内容
LEA SI,DATA1
若【DATA1】=1234H,则SI=1234H
DATA1是个符号地址,表示一个地址,DATA1的内容就是要传输到SI的地址
MOV BX,[BX]
把BX的内容[BX]传给BX,作为BX的地址
BX表示BX本身的地址,[BX]表示BX的内容
LEA BX,[BX]
把[BX]这个内容所在的偏移地址传送给BX,作为BX的内容
【例】LEA直接传输地址很方便。将首地址中的MEM1的50个字节的数据送到同一逻辑段首地址为MEM2的区域存放
LEA SI,MEM1【把MEM1的地址给SI】
LEA DI,MEM2【把MEM2的地址给DI】
MOV CL,50 【传递字节的长度】
NEXT:MOV AL,[SI] 【SI的内容[SI]就是MEM1】
MOV [DI],AL
INC SI【SI加加】
INC DI【DI加加】
DEC CL
JNZ NEXT【判断CL是否等于0 等于零则next循环结束】
指针送寄存器和DS指令LDS
将源操作数指定的连续4个存储单元中存放的32位地址指针(包括段地址和偏移地址) 送2个16位寄存器
格式:LDS(LES) DEST,SRC
DEST: 寄存器【偏移地址放在通用寄存器,段地址放在段寄存器DS或ES】
STC: 必须使用存储器寻址
偏移地址【两个低位】放在通用寄存器,段地址放在段寄存器DS或ES【两个高位】
OFFSET取偏移地址作为传输到dest的内容
相对低(高?)的两位是基地址,存在BX
相对高(低?)的两位是偏移地址,存在LDS或LES
标志位操作指令
LAHF/SAHF【隐含操作数AH】
LAHF:将FLAGS的低八位装入AH
SAHF:和AF操作相反
PUSHF/POPFJ【针对FLAGS的堆栈操作指令(16位)】
堆栈是按字操作!!!
将标志寄存器压栈或从栈中弹出
算术运算指令
加法运算指令
减法运算指令
乘法指令
除法指令
加法指令
普通加法指令ADD
格式:ADD OPRD1,OPRD2
操作:OPRD1+OPRD2并存入OPRD1
OPRD1 寄存器,存储器 不能是立即数
OPRD2 寄存器,存储器 立即数
ADD指令的执行对全部6个状态标志位都产生影响
【特点】
可以进行8位,16位的无符号数和带符号数的加法运算
源操作数和目标操作数不能同时为存储器,不能为段寄存器
ADC指令
指令格式、对操作数的要求、对标志位的影响与ADD指令完全一样
操作:OPRD1+OPRD2+CF 并存入OPRD1
ADC指令多用与多字节数相加,使用前要先将CF清零
【不确定CF是否存在,程序启动前首先要对CF清零!!】
清零指令 CLC
INC 累加 相当于 c+=c【c=c+1】
格式:INC OPRD
操作:OPRD+1 ——>OPRD【OPRD不能是立即数或段寄存器】
INC常用于修改地址指针,经常和循环配套使用
减法指令
普通减法指令SUB(ADD)
考虑借位的建发指令SBB(ADC)
自减指令DEC(INC)
比较指令CMP
求补指令NEG
SUB指令
格式:SUB OPRD1,OPRD2【最终结果存在OPRD1】
SBB指令
操作:OPRD1-OPRD2-CF 并存入OPRD1
DEC指令
格式 DEC OPRD
NEG指令
格式:NEG OPRD
操作:将操作数按位求反后末位+1【先确认是负数】
0- OPRD ——>OPRD
用0减去操作数,相当于对该操作数求补码
CMP指令
格式:CMP OPRD1,OPRD2
CMP指令不存到OPRD1,不影响目标操作数只影响标志位
【注】
根据Z标志,判断二者是否相等
根据CF标志,判断两个无符号数的大小
用S、O标志,判断两个带符号位的大小
OF SF同状态——AX>BX
OF SF异状态——AX<BX
乘法指令
无符号惩罚指令 MUL
带符号乘法指令IMUL
【注】
乘法指令采用隐含寻址,隐含的是存放被乘数的累加器AL或AX 以及存放结果的AX DX
无符号数乘法指令
格式:MUL OPRD【OPRD不能是立即数】
OPRD为字节数——AL*OPRD——AX
OPTD为16位数——AX*OPRD——DX AX
【注】
存放结果的地址要是乘数两倍长
除法指令
无符号除法指令DIV
有符号除法指令IDIV
无符号除法指令DIV
格式:DIV SRC
若OPRD是字节数【8位】
执行:AX/OPRD
结果:AL 是商 AH是余数
若OPRD是双字节数【16位】
执行:DXAX/OPRD
结果:AX 是商 DX 是余数
指令要求被除数是除数的两倍长
有符号除法指令IDIV
格式:IDIV SRC
存放结果同上