微机原理单片机核心知识点详解

其余知识点请私聊

  • 8086寻址方式
  • 一、数据寻址方式(重点%

    1、立即寻址

     操作数(为一常数)直接由指令给出

        (此操作数称为立即数)

    立即寻址只能用于源操作数

    例:

    MOV    AX,  1C8FH

    MOV   BYTE PTR[2A00H], 8FH

    错误例:

    ×  MOV 2A00H,AX ; 错误!

    指令操作例:MOV AX,3102H; AXè3102H

    执行后,(AH) = 31H,(AL) = 02H

    2、寄存器寻址

    (1)操作数放在某个寄存器中

    (2)源操作数与目的操作数字长要相同

    (3)寄存器寻址与段地址无关

    例:

              MOV    AX,  BX

              MOV    [3F00H],  AX

              MOV    CL,  AL

        错误例: 

         × MOV  AX,BL            ; 字长不同

    ×  MOV ES:AX,DX     ; 寄存器与段无关

    3、直接寻址

    (1)指令中直接给出操作数的16位偏移地址

       偏移地址也称为有效地址(EA, Effective Address)

    (2)默认的段寄存器为DS,但也可以显式地指定其他段寄存器——称为段超越前缀

    (3)偏移地址也可用符号地址来表示,如ADDR、VAR

    例:

                MOV    AX ,[2A00H]

                MOV    DX ,ES:[2A00H]

    MOV    SI,TABLE_PTR

    4、间接寻址

    l 操作数的偏移地址(有效地址EA)放在寄存器中

    l 只有SI、DI、BX和BP可作间址寄存器

    l   例: MOV  AX,[BX]

             MOV  CL,CS:[DI]

        错误例 :×  MOV    AX, [DX]

                    × MOV    CL, [AX]

    5、寄存器相对寻址

    lEA=间址寄存器的内容加上一个8/16位的位移量

    l 例:  MOV   AX,  [BX+8]

            MOV   CX,  TABLE[SI]

            MOV   AX,  [BP]; 默认段寄存器为SS

    l 指令操作例:MOV  AX,DATA[BX]

        若(DS)=6000H, (BX)=1000H, DATA=2A00H,

            (63A00H)=66H,  (63A01H)=55H

        则物理地址 = 60000H + 1000H + 2A00H = 63A00H

    指令执行后:(AX)=5566H

    6、基址变址寻址

    l 若操作数的偏移地址:

    由基址寄存器(BX或BP)给出 —— 基址寻址方式

    由变址寄存器(SI或DI)给出 —— 变址寻址方式

    由一个基址寄存器的内容和一个变址寄存器的内容相加而形成操作数的偏移地址,称为基址-变址寻址。

    EA=(BX)+(SI)或(DI);

    EA=(BP)+(SI)或(DI)

    同一组内的寄存器不能同时出现。

    注意:除了有段跨越前缀的情况外,当基址寄存器为BX时,操作数应该存放在数据段DS中,当基址寄存器为BP时,操作数应放在堆栈段SS中。

    例:

            MOV    AX,  [BX] [SI]

            MOV    AX,  [BX+SI]

            MOV    AX,  DS: [BP] [DI]

    错误例:

     ×  MOV    AX,  [BX] [BP]

     × MOV    AX,  [DI] [SI]

    指令操作例:MOV  AX,[BX][SI]

    假定:(DS)=8000H,  (BX)=2000H,  SI=1000H

    则物理地址 = 80000H + 2000H + 1000H = 83000H

    指令执行后: (AL)=[83000H]

    (AH)=[83001H]

    7、相对基址变址寻址

    l 在基址-变址寻址的基础上再加上一个相对位移量

    EA=(BX)+(SI)或(DI)+8位或16位位移量;

    EA=(BP)+(SI)或(DI)+8位或16位位移量

    指令操作例MOV AX,DATA[DI][BX]

    若(DS)=8000H, (BX)=2000H, (DI)=1000H, DATA=200H

    则指令执行后(AH)=[83021H],  (AL)=[83020H]

    寄存器间接、寄存器相对、基址变址、相对基址变址四种寻址方式的比较:

       寻址方式             指令操作数形式

    n 寄存器间接        只有一个寄存器(BX/BP/SI/DI之一)

    n 寄存器相对        一个寄存器加上位移量

    n 基址—变址        两个不同类别的寄存器

    n 相对基址-变址     两个不同类别的寄存器加上位移量

    二、地址寻址方式(了解有4类,能判断)

    简要判断依据(指令中间的单词):

    段内直接  short,near

    段内间接  word

    段间直接  far

    段间间接  dword

  •   8086指令系统
  • 一、数据传送指令(重点%

    1、通用传送指令

    (1) MOV dest,src; dest←src

    传送的是字节还是字取决于指令中涉及的寄存器是8位还是16位。

    具体来说可实现:

  • MOV  mem/reg1,mem/reg2
  • 指令中两操作数中至少有一个为寄存器

    ② MOV  reg,data    ;立即数送寄存器

    ③ MOV  mem,data    ;立即数送存储单元

    ④ MOV  acc,mem     ;存储单元送累加器

    ⑤ MOV  mem,acc     ;累加器送存储单元

    ⑥ MOV  segreg,mem/reg ;存储单元/寄存器送段寄存器

    ⑦ MOV  mem/reg,segreg ;段寄存器送存储单元/寄存器

    MOV指令的使用规则

    ①IP不能作目的寄存器

    ②不允许mem←mem

    ③不允许segreg←segreg

    ④立即数不允许作为目的操作数

    ⑤不允许segreg←立即数

    ⑥源操作数与目的操作数类型要一致

    ⑦当源操作数为单字节的立即数,而目的操作数为间址、变址、基址+变址的内存数时,必须用PTR说明数据类型。如:MOV [BX],12H 是错误的。

    (2)、堆栈指令

    什么是堆栈?

    按“后进先出(LIFO)”方式工作的存储区域。堆栈以为单位进行压入弹出操作。

    规定由SS指示堆栈段的段基址,堆栈指针SP始终指向堆栈的顶部,SP的初值规定了所用堆栈区的大小。堆栈的最高地址叫栈底。

  • 压栈指令PUSH
  • PUSH    src    ; src为16位操作数

    例:PUSH AX ;将AX内容压栈

    执行操作:(SP)-1←高字节AH

    (SP)-2←低字节AL

    (SP)←(SP)- 2

    注意进栈方向是高地址低地址发展。`

  • 弹出指令POP
  • POP dest

    例:POP BX ;将栈顶内容弹至BX

    执行操作:(BL)←(SP)

    (BH)←(SP)+1

    (SP)←(SP)+2

    堆栈指令在使用时需注意的几点:

  • 堆栈操作总是按字进行
  • 不能从栈顶弹出一个字给CS
  • 堆栈指针为SS:SP,SP永远指向栈顶
  • ④SP自动进行增减量(-2,+2)

    (3)、交换指令XCHG

    格式:XCHG  reg,mem/reg

    功能:交换两操作数的内容。

    要求:两操作数中必须有一个在寄存器中;

    操作数不能为段寄存器和立即数;

    源和目地操作数类型要一致。

    举例:  XCHG AX,BX

    XCHG [2000],CL

    (4)查表指令XLAT

    执行的操作:AL←[(BX)+(AL)]

    又叫查表转换指令,它可根据表项序号查出表中对应代码的内容。执行时先将表的首地址(偏移地址)送到BX中,表项序号存于AL中。

    2、输入输出指令

    只限于用累加器AL或AX来传送信息。

    功能: (累加器)←→I/O端口

    1. 输入指令IN

    格式:

    IN acc,PORT ;PORT端口号0~255H

    IN acc,DX   ;DX表示的端口范围达64K

    例:IN AL,80H  ;(AL)←(80H端口)

    IN AL,DX   ;(AL)←((DX))

    (2) 输出指令OUT

    格式:OUT  port,acc

    OUT  DX,acc

    例:OUT 68H,AX  ;(69H,68H)←(AX)

    OUT DX,AL   ;((DX))←(AL)

    在使用间接寻址的IN/OUT指令时,要事先用传送指令把I/O端口号设置到DX寄存器

    如:

    MOV  DX,220H

    IN   AL,DX;将220H端口内容读入AL

    3、目标地址传送指令

    1. LEA

    传送偏移地址

    格式:LEA reg,mem    ; 将指定内存单元的偏移地址送到指定寄存器

    要求:

    1. 源操作数必须是一个存储器操作数;
    2. 目的操作数必须是一个16位的通用寄存器。

    例:LEA  BX,[SI+10H]

    设:(SI)=1000H

    则执行该指令后,(BX)=1010H

    l注意以下二条指令差别:

    LEA BX,BUFFER

    MOV BX,BUFFER

    前者表示将符号地址为BUFFER的存储单元的偏移地址取到 BX中;后者表示将BUFFER存储单元中的内容取到 BX中。

    下面两条指令等效:

    LEA BX,BUFFER

    MOV BX, OFFSET BUFFER

    其中OFFSET BUFFER表示存储器单元BUFFER的偏移地址。

    二者都可用于取存储器单元的偏移地址,但LEA指令可以取动态的地址,OFFSET只能取静态的地址。

    二、算术运算指令

    1. 加法指令
      1. 不带进位的加法指令ADD

    格式:  ADD  acc,data

    ADD  mem/reg,data

    ADD  mem/reg1,mem/reg2

    实例:

    ADD  AL,30H

    ADD  SI,[BX+20H]

    ADD  CX,SI

    ADD  [DI],200H

    •ADD指令对6个状态标志均产生影响。

    例:已知(BX)=D75FH

    指令 ADD  BX,8046H 执行后,状态标志各是多少?

    D75FH = 1110 0111 0101 1111

    8046H = 1000 0000 0100 0110

    1           1 11 11

    0110 0111 1010 0101

    结果:C=1, Z=0, P=0, A=1, O=1, S=0

    判断溢出与进位(重点%

    从硬件的角度:默认参与运算的操作数都是有符号数,当两数的符号位相同,而和的结果相异时有溢出,则OF=1,否则OF=0

    1. 带进位的加法ADC

    ADC指令在形式上和功能上与ADD类似,只是相加时还要包括进位标志CF的内容,例如:

    ADC  AL,68H ;  AL←(AL)+68H+(CF)

    ADC  AX,CX  ;AX←(AX)+(CX)+(CF)

    ADC  BX,[DI]  ;BX←(BX)+[DI+1][DI]+(CF)

    (3)加1指令INC

    格式:INC  reg/mem

    功能:类似于C语言中的++操作:对指定的操作数加1 

    例:  INC  AL

    INC  SI

    INC  BYTE PTR[BX+4]

    注:本指令不影响CF标志。

    (4)非压缩BCD码加法调整指令AAA

    AAA指令的操作:

    如果AL的低4位>9或AF=1,则:

    ① AL←(AL)+6,(AH)←(AH)+1,AF←1

    ② AL高4位清零

    ③ CF←AF

    否则AL高4位清零

    (5)压缩BCD码加法调整指令DAA

    l两个压缩BCD码相加结果在AL中,通过DAA调整得到一个正确的压缩BCD码.

    l指令操作(调整方法):

    若AL的低4位>9或AF=1

    则(AL)←(AL)+6,AF←1

    若AL的高4位>9或CF=1

    则(AL)←(AL)+60H,CF←1

    l除OF外,DAA指令影响所有其它标志。

    lDAA指令应紧跟在ADD或ADC指令之后。

    1. 减法指令

    (1)不考虑借位的减法指令SUB

    格式: SUB  dest, src

    操作: dest←(dest)-(src)

    注:1.源和目的操作数不能同时为存储器操作数

    2.立即数不能作为目的操作数

    指令例子:

    SUB  AL,60H

    SUB  [BX+20H],DX

    SUB  AX,CX

    (2)考虑借位的减法指令SBB

    SBB指令主要用于多字节的减法。

    格式: SBB  dest, src

    操作: dest←(dest)-(src)-(CF)

    指令例子:

    SBB  AX,CX

    SBB  WORD PTR[SI],2080H

    SBB  [SI],DX

    (3)减1指令DEC

    作用类似于C语言中的”--”操作符。

    格式:DEC  opr

    操作:opr←(opr)-1

    指令例子:

    DEC  CL

    DEC  BYTE PTR[DI+2]

    DEC  SI

    (4)求补指令NEG

    格式: NEG  opr

    操作: opr← 0-(opr)

    对一个操作数取补码相当于用0减去此操作数,故利用NEG指令可得到负数的绝对值。

    例:若(AL)=0FCH,则执行 NEG AL后,

    (AL)=04H,CF=1

    (5)比较指令CMP

    格式: CMP  dest, src

    操作: (dest)-(src)

    CMP也是执行两个操作数相减,但结果不送目标操作数,其结果只反映在标志位上。

    指令例子:

    CMP  AL,0AH

    CMP  CX,SI

    CMP  DI,[BX+03]

    (6)非压缩BCD码减法调整指令AAS

    对AL中由两个非压缩的BCD码相减的结果进行调整。调整操作为:

    若AL的低4位>9或AF=1,则:

    ① AL←(AL)-6,AH←(AH)-1,AF←1

    ② AL的高4位清零

    ③ CF←AF

    否则:AL的高4位清零

    (7)压缩BCD码减法调整指令DAS

    对AL中由两个压缩BCD码相减的结果进行调整。调整操作为:

    若AL的低4位>9或AF=1,则:

    AL←(AL)-6, 且AF←1

    若AL的高4位>9或CF=1,则:

    AL←(AL)-60H,且CF←1

    DAS对OF无定义,但影响其余标志位。

    DAS指令要求跟在减法指令之后。

    1. 乘法指令

    进行乘法时:8位*8位→16位乘积

    16位*16位→32位乘积

    (1) 无符号数的乘法指令MUL(MEM/REG)

    格式: MUL   src

    操作:字节操作数  (AX)←(AL) × (src)

    字操作数      (DX, AX)←(AX) × (src)

    指令例子:

    MUL  BL   ;(AL)×(BL),乘积在AX中

    MUL  CX   ;(AX)×(CX),乘积在DX,AX中

    MUL  BYTE PTR[BX]

    (2)有符号数乘法指令IMUL

    格式与MUL指令类似,只是要求两操作数均为有符号数

    指令例子:

    IMUL  BL   ;(AX)←(AL)×(BL)

    IMUL  WORD PTR[SI];

    (DX,AX)←(AX)×([SI+1][SI])

    注意MUL/IMUL指令中

    ● AL(AX)为隐含的乘数寄存器;

    ● AX(DX,AX)为隐含的乘积寄存器;

    ● SRC不能为立即数;

    ● 除CF和OF外,对其它标志位无定义。

    4、除法指令

    进行除法时:16位/8位→8位商

    32位/16位→16位商

    对被除数、商及余数存放有如下规定:

    被除数         商           余数

    字节除法   AX           AL          AH

    字除法   DX:AX         AX          DX

    (1)无符号数除法指令DIV

    格式: DIV   src

    操作:字节操作  (AL)←(AX) / (SRC) 的商

    (AH)←(AX) / (SRC) 的余数

    字操作    (AX) ←(DX, AX) / (SRC) 的商

    (DX) ←(DX, AX) / (SRC) 的余数

    指令例子:

    DIV  CL

    DIV  WORD PTR[BX]

    (2)有符号数除法指令IDIV

    格式: IDIV   src

    操作与DIV类似。商及余数均为有符号数,且余数符号总是与被除数符号相同。

    注意: 对于DIV/IDIV指令

    AX(DX,AX)为隐含的被除数寄存器。

    AL(AX)为隐含的商寄存器。

    AH(DX)为隐含的余数寄存器。

    src不能为立即数。

    对所有条件标志位均无定

    关于除法操作中的字长扩展问题

    •除法运算要求被除数字长是除数字长的两倍,若不满足则需对被除数进行扩展,否则产生错误。

    •对于无符号数除法扩展,只需将AH或DX清零即可。

    •对有符号数而言,则是符号位的扩展。可使用前面介绍过的符号扩展指令CBW和CWD

    三、逻辑运算和移位指令

    1、逻辑运算指令

    (1)逻辑与AND

    对两个操作数进行按位逻辑“与”操作。

    格式:AND   dest, src

    用途:保留操作数的某几位,清零其他位。

    例1:保留AL中低4位,高4位清0。

    AND  AL,0FH

    (2)逻辑或OR

    对两个操作数进行按位逻辑”或”操作。

    格式:OR  dest, src

    用途:对操作数的某几位置1;对两操作数进行组合。

    例1:把AL中的非压缩BCD码变成相应十进制数的ASCII码。

    OR  AL, 30H

    (3)逻辑非NOT

    对操作数进行按位逻辑”非”操作。

    格式:NOT  mem/reg

    例:NOT  CX

    NOT  BYTE PTR[DI]

    (4)逻辑异或XOR

    对两个操作数按位进行”异或”操作。

    格式:XOR  dest, src

    用途:对reg清零(自身异或)

    把reg/mem的某几位变反(与’1’异或)

    例1:把AX寄存器清零。

    ①MOV  AX,0

    ②XOR  AX,AX

    ③AND  AX,0

    ④SUB  AX,AX

    (5)测试指令TEST

    操作与AND指令类似,但不将”与”的结果送回,只影响标志位。

    TEST指令常用于位测试,与条件转移指令一起用。

    例:测试AL的内容是否为负数。

          TEST  AL,80H  ;检查AL中D7=1?        

          JNZ   MINUS   ;是1(负数),转MINUS               

    … …         ;否则为正数

    2、移位指令

    (1)非循环移位指令(重点%

       算术左移指令 SAL(Shift Arithmetic Left)

       算术右移指令 SAR(Shift Arithmetic Right)

       逻辑左移指令 SHL(Shift Left)

       逻辑右移指令 SHR(Shift Right)

    这4条指令的格式相同,以SAL为例:

    CL  ;移位位数大于1时

    SAL  mem/reg

    1. ;移位位数等于1时

    Ø算术移位——把操作数看做有符号数;

     逻辑移位——把操作数看做无符号数。

    Ø移位位数放在CL寄存器中,如果只移1位,也

     可以直接写在指令中。例如:

     MOV  CL,4

     SHR  AL,CL  ;AL中的内容右移4位

    Ø影响C,P,S,Z,O标志。

    Ø结果未溢出时:

         左移1位≡操作数*2

    右移1位≡操作数/2

    例:把AL中的数x乘10

    因为10=8+2=23+21,所以可用移位实现乘10操作。程序如下:

    MOV  CL,3

    SAL   AL,1      ; 2x

    MOV  AH,AL     

    SAL   AL,1      ; 4x

    SAL   AL,1      ; 8x

    ADD  AL,AH    ; 8x+2x = 10x

    四、控制转移指令

    1. 转移指令

    (1)无条件转移指令JMP

      格式:JMP label

    本指令无条件转移到指定的目标地址,以执行从该地址开始的程序段。

    (2)条件转移指令(补充内容)(重点%

     根据单个标志位设置的条件转移指令

    JB/JC       ;低于,或CF=1,则转移

    JNB/JNC/JAE ;高于或等于,或CF=0,则转移

    JP/JPE      ;奇偶标志PF=1(偶),则转移

    JNP/JPO     ;奇偶标志PF=0(奇),则转移

    JZ/JE       ;结果为零(ZF=1),则转移

    JNZ/JNE     ;结果不为零(ZF=0),则转移

    JS          ;SF=1,则转移

    JNS        ;SF=0,则转移

    JO   ;OF=1,则转移

    JNO   ;OF=0,则转移

    ②根据组合条件设置的条件转移指令

    这类指令主要用来判断两个数的大小。

    ★判断无符号数的大小

    lJA     高于则转移

        条件为: CF=0∧ZF=0,即A>B

    lJNA/JBE  低于或等于则转移

    条件为: CF=1∨ZF=1,即A≤B

    lJB    A<B则转移

    lJNB   A≥B则转移

    ★判断有符号数的大小

    lJG ;大于则转移(A>B)

          条件为: (SF⊕OF=0)∧ZF=0

    lJGE;大于或等于则转移(A≥B)

    条件为: (SF⊕OF=0)∨ZF=1

    lJLE;小于或等于则转移(A≤B)

        条件为: (SF⊕OF=1)∨ZF=1

    lJL;小于则转移(A<B=

    条件为: (SF⊕OF=1)∧ZF=0

    2、循环控制指令

    l用在循环程序中以确定是否要继续循环。

    l循环次数通常置于CX中。

    l转移的目标应在距离本指令-128~+127的范围之内。

    l循环控制指令不影响标志位。

    (1)LOOP

    格式:LOOP   label

    操作:(CX)-1→CX;

          若(CX)≠0,则转至label处执行

          否则退出循环,执行LOOP后面的指令。

      LOOP指令与下面的指令段等价:

     DEC  CX

     JNZ  label

    3、过程调用指令

    (1)调用指令CALL

    一般格式:CALL  sub   ;sub为子程序的入口

    4、中断指令

    (1)INT n  执行类型n的中断服务程序,N=0~255

    五、处理器控制指令

    1、标志位操作

    (1)CF设置指令

          CLC    0→CF

           STC    1→CF

            CMC   CF变反

    (2)DF设置指令

          CLD    0→DF (串操作的指针移动方向从低到高)

    STD    1→DF (串操作的指针移动方向从高到低)

    (3)IF设置指令

      CLI     0→IF (禁止INTR中断)

      STI     1→IF (开放INTR中断) 

    1. HLT(halt)

    执行HLT指令后,CPU进入暂停状态。

    作者:想975

    物联沃分享整理
    物联沃-IOTWORD物联网 » 微机原理单片机核心知识点详解

    发表回复