微机原理第三章笔记(2):第四周第一节课
耳東酉良
2020年10月06日 21:05

【上节重点】

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

存放结果同上