第三章 8086指令结构

1、传送指令

         A通用。B累加器专用。C地址。D标志

A:通用传送指令

         ①:最基本的传送指令 MOV

                  MOV 目的 源        #目的:OPRD1。源:OPRD2。

         实现:

                  MOV AX,4234H

                  MOV AX,BX

                  MOV AL,[1000H]

         注:①:可以传送16位的数据,也可以传送8位的数据

                  ②:不能在两个内存单元之间直接传送

                          MOV [BX],[1000H] 错误的

                  ③:CS和IP不能作为目的操作数,可作为源操作数

                          MOV CS,1000H  错误的

                  ④:不能将立即数直接传送到段寄存器中

                  ⑤:段寄存器之间不能互相传送

                          MOV DS,2000H  错误的

                          应该变为两句话传输   MOV AX,2000H

                                                                      MOV DS,AX

                          MOV ES,DS  错误的

                          变为两句话传输:MOV AX,DS

                                                             MOV ES,AX

         ②:堆栈操作指令:PUSH和POP

                  堆栈:一段内存区域,可用于保存中间数据,运算结果或某些寄存器的值,需要时可以从堆栈中将数据取出,按照先进后出的原则使用数据

         注:微机把内存的一段区域作为堆栈使用,即堆栈段SS,段内的物理地址由SS和SP决定,SP始终指向栈顶(栈顶是最底下)

                          PUSH OPRD(数据) 叫做压栈

                          POP OPRD  叫做出栈

         对PUSH和POP的说明:

                  ①:堆栈操作总是按字运行的

                  ②:PUSH AX          AX为1122H           

                  注:每进入一个字,SP要减2(SP-2)

         高字节放在较高地址,低字节放在较低地址

                                   弹出一个字的时候,SP要加二(SP+2)   #SP+2就是在回到所谓的栈底.

                  ③:CS可以压栈,但是不能出栈。

         ③:交换指令XCHG

                  XCHG 目的 源

                          寄存器 <-> 寄存器(双向)

         或             寄存器 <--> 内存(双向)

                  注:①:目的和源操作数,都不能是立即数或段寄存器,并且不能同时为内存单元

                          XCHG [BX] [DI]  错误的 (同时都是内存单元,中括号表示内存单元)

                          ②:CS 和IP不能为源操作数,目的操作数

                          ③:目的和源操作数,取值范围要相同,同为8位或16位

                                   XCHG BL,DL     对的(同时8位)

                                   XCHG AX,SI      对的(同时16位)

         ④:换码指令XLAT:用于编码制转换

                  注:使累加器中的某个值转换为内存表格中对应的某个值,使用该指令前内存表的首地址,赋给BX,AL中存放表格某一项,与表格首地址的位移量,执行BX+AL得到该表格中的一个地址,再将该地址所对应的值传送到AL中

                  补充:使用XLAT换码指令时,内存中必须有一个码表

         ⑤:输入/输出指令 IN、OUT

                  注:输入指令用于CPU从外设端口接收数据,输出指令用于CPU向外设端口发送数据

                  端口:CPU与外设之间通过接口进行数据交换,一个端口通常对应接口中的一个或几个寄存器,每8位端口有一个地址叫做端口号,两个相邻的8位组成16位端口

                  端口数:最多为65536个,端口号0000H~FFFFH

分类:直接输入/输出

                  前256端口直接输出(2^8,00H~FFH)

                          IN 累加器,端口号

                          out 端口号,累加器

                  IN AL,50H         #510H是端口号

                  IN AX,70H        #AX里存放的是70H与71H

                  OUT 44H,AL

直接输入/输出

                  IN 累加器,DX   

                  IN AX,DX                   #这两句话完成

地址传送指令

         LEA:取有效地址指令

                  LEA 目的,源

                  注:源操作数为内存单元地址,目的操作数为16位的寄存器

                  LEA AX,[2782H]

                  LEA BX,[BP+SI]

         LDS:取地址指针,放入DS中,和其它寄存器的指令

                  注:将四个字节的内存单元地址送到两个目的寄存器中,其中后两个字节为段地址,送到DS中

         LES:取地址指针,放入ES和其他寄存器的指令

                  LES DI,[2130H]

标志传送指令

                  LAHF:读取标志指令

                  SAHF:设置标志指令

 二、算术运算指令

         加法

                  ADD:不带进位的加法指令

                  ADC:带进位的加法指令、

                  注:①:无符号和有符号加法,减法可以使用同一个指令,无符号和有符号的乘法和除法,不能使用同一个指令

                          ②:无符号运算产生溢出指的是CF=1时会设置进位,对于多字节运算中使用,要利用进位向高字节传递数值

                  INC:增量加1

                  注:IAC一般用在循环中,修改指针或修改循环次数

         减法

                  SUB:不考虑错位的减法指令

                          SUB BX,CX

                  SBB:考虑借位的减法的指令

                  DEC:减1

         乘法:无符号乘法指令和有符号乘法指令

                  无符号:MUL

                          1、①:MUL BL

                             ②:MUL CX

                          注:乘法隐含的一个操作数为ALAX

                  伪指令

                          2MUL BYTE PTR[DI]

                             MUL WORD PTR[SI]

         有符号:IMUL

                          IMUL CL

                          IMUL CX

         除法

                  无符号:DIV

                  注:除法隐含的也是AXAL

                  DIV CL

                  DIV CX

                  DIV BYTE PTR[DI]

         有符号:IDIV

 

二、逻辑运算

         AND

         OR

         NOT

         XOR 异或

         TEST 检测(类似于AND)

                  AND:在与运算中,与0运算就是置0,与1运算就是原值不变。

                  OR:与1运算为1,与0运算不变。

                  XOR:①:取反功能。②:寄存器清0

         AND一般用于指定位数清零

         OR一般用于指定位置置1

         XOR一般用于某个寄存器清0

         TESE:用于测定指定寄存器中某个位置是0还是1

三、位移指令

         ①:SAL:非循环算术左移指令

                  注:左移低位补0,高位进入CF标志位

         ②:SHL:非循环逻辑左移指令

         ③:SAR:非循环算术右移指令

                  注:高位不变向前填充,低位进入CF标志位

         ④:SHR:非循环逻辑右移指令

                  注:以0填充,低位进入CF标志位

         ROL:不带进位的循环左移指令

         ROR:不带进位的右移指令

         RCL:带进位的左移指令

         RCR:带进位的右移指令

四、串操作指令

                  注:①串操作指令要通过重复前缀来实现串操作

                          ②:以SI作为源操作数的指针寄存器,默认段为DS段,以DI 作为目的操作数的指针寄存器,默认段在ES

         [DS:SI]à[ES:DI]

                  注:将DS段,SI所指出的字节或字,传送到ES段,DI所指的存储单元,自动修改地址DISI

         字符串比较指令

                  CMPSB  CMPSW

                  注:REPE/REPZ(功能:找不同的字符)表示CX !=0且比较的字节相等(ZF=1)这个时候继续比较,当ZF=0时,结束比较

                  REPNE/REPNZ(功能:找相同字符)表示CX !=0且比较的字符不等(ZF=0),这个时候继续比较,当ZF=1时,结束比较

         字符串检索指令

                  SCASB/SCASW

                  前缀:REPE/REPZ CX不等于0AL(AX)内容相等,表示ZF=1,继续检索(找不一样)

                  前缀:REPNE/REPNZ CX不等于0且与AL(AX)内容不等,ZF=0.继续检索(找一样)

         取字符串指令

                  LODSB/LODSW

         存字符串指令

                  STOSB/STOSW

                  注:取字符串指令,不使用前缀,存字符串指令,使用REP前缀表示可以使一个字符串填充到内存单元中

         控制转移指令

                  ①:段内直接转移指令

                          JMP 1000H

                  ②:段内间接转移指令

                          JMP CX

                          JMP[CX]

                  ③:段间直接转移指令

                          JMP B000H:0100H

                  ④:段间间接转移指令

                          JMP DW ORD PRT[BX+ SI]

                          CALL RET   子程序调用和返回指令

         条件转移指令

                  注:满足条件时执行指定的目标,不满足条件时执行下一条指令,判断条件根据CFSFOFPFZFCX

                  条件跳转指令分为有符号数的跳转和无符号跳转,有符号的叫大于、小于,无符号的叫高于、低于。

                  JE/JZ         等于/0 时跳转(ZF=1)à这里计算机判断

                  JNE/JNZ   不为0时转移(ZF=0时判断)

有符号的:

         JG/JNLE            大于/不小于等于

JNG/JLE            不大于/小于等于

JL/JNGE            小于/不大于等于

JNL/JGE            不小于/大于等于

无符号的:

         JB/JNAE           低于/不高于等于

         JNB/JAE            不低于/高于等于

         JA/JNBE            高于/不低于等于

         JNA/JBE           不高于/低于等于

JS     SF1时跳转

JNS  SF0时转移

JO    OF1时跳转

JNO OF0时转移

JP     PF1时跳转

JNP  PF0时转移  

 

猜你喜欢

转载自www.cnblogs.com/xian-luo/p/11440464.html