• 第三章 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时转移  

     

  • 相关阅读:
    10.20stark组件已经完工
    webpack3到webpack4
    app埋点
    postman使用
    phantomjs
    nodejieba中文分词
    爬虫--cheerio
    mysql命令(三)
    mysql学习(二)
    mysql安装登录
  • 原文地址:https://www.cnblogs.com/xian-luo/p/11440464.html
Copyright © 2020-2023  润新知