1.数据传送类指令

2.算术运算类指令

3.位操作类指令

4.串操作类指令

5.控制转移类指令

6.处理器控制类指令

数据传送类指令

  1. 传送指令MOV
    1. 把一个字节或字的操作数从源地址传送至目的地址。
    2. 注意:不存在存储器想存储器的传送指令。

image.png

  1. 交换指令XCHG(exchange)

情形

  1. 寄存器与寄存器直接对换数据
  2. 寄存器与存储器之间对换数据
  3. 不能在存储器与存储器之间对换数据
  • 效率:xchg优于mov,因为xchg使用了内部暂存器。
  • 举例:
      1. al,ah高低交换
      1. 存储器[2040]与[2050]交换
  1. 换码指令XLAT
    1. 作业:将BX指定的缓冲区中,AL指定的位移处的一个字节取出赋给AL。 即: al <— ds:[bx+al]
    2. 该指令无操作数
    3. 用途:键盘的扫描码,需要转为ASCII码,可以将扫描码做成表,扫描码作下标可以查到对应的ASCII码。

DosBox示例:
mov bx,0
mov al,3
xlat
mov al,4
mov al,a
xlat

堆栈操作指令

  1. 进栈(push reg)
    1. sub sp,2
    2. mov [sp],reg
  2. 出栈(pop reg)
    1. mov reg,[sp]
    2. add sp,2
  3. 保存所有寄存器环境
    1. 16位: pusha / popa
    2. 32位: pushad / popad

      标志寄存器传送指令

  • 标志寄存器传送指令用来传送标志寄存器FLAGS的内容,方便进行对各个标志位的直接操作。
  • 有2对4条指令
    • 低8位传送:LAHF和SAHF
    • 16位传送:PUSHF和POPF

image.png

image.png

地址传送指令

  • 地址传送指令将存储单元的逻辑地址送至指定的寄存器
    • 有效的地址传送指令LEA
    • 指针传送指令LDS和LES
  • 注意不是获取存储单元的内容

DosBox示例
-e ds:5566 “hello”
-a
mov bx,2233
mov ax,[bx+3333]
lea cx,[bx+3333]

  • 注意不是获取存储器单元的内容

image.png
image.png

输入输出指令

  • 8086通过输入输出指令与外设进行数据交换;呈现给程序员的外设是端口(port) 即I/O地址。
  • 8086用于寻址外设端口的地址线为16条,端口最多为2^16=65536(64k)个,端口号为0000H~FFFFH
  • 每个端口用于传送一个字节的外设数据

image.png
image.png

算术运算类指令

  1. 四则运算是计算机经常进行的一种操作。算术运算指令实现二进制(和十进制)数据的四则运算。
  2. 请注意算术运算类指令对标志的影响。
    1. 掌握:ADD/ADC/INC SUB/SBB/DEC NEG/CMP
    2. 熟系: MUL/IMUL、DIV/IDIV
    3. 理解: CBW/CWD、DAA/DAS、AAA/AAS/AAM/AAD
  • 加法
    • add:加法
    • image.png
    • adc:带进位加法
    • image.png
    • inc:加一,不影响CF标志位

编写汇编资料计算加法:

  • 76543218
  • +fa23fnc3
  • =170782ddb

  • 减法

    • sub减法
    • image.png
    • sbb带借位的减法
    • image.png
    • DEC-1,不影响CF位

编写汇编指令计算减法:

  • 70782DDB
  • -76543218
  • =70782DD8

  • 求补指令NEG(negative)

    • NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数
    • 求补运算也可以表达成:将操作数按位去反后加1
    • neg ax;如果ax=0,则CF标志位=0;若ax!=0,则CF=1
    • image.png

  1. debug中的标志位显示顺序
  2. OF DF IF SF ZF AF PF CF
  3. OF 标志位(溢出)
  4. OF = 1, 显示为OV
  5. OF = 0, 显示为NV
  6. 影响OF的指令举例, INC
  7. DF 标志位(方向)
  8. DF = 0, 显示为UP
  9. DF = 1, 显示为DN
  10. 影响DF的指令举例, CLD, STD
  11. IF 标志位(中断)
  12. IF = 0,显示为DI
  13. IF = 1, 显示为EI
  14. 影响IF的指令举例, CLI, STI
  15. SF 标志位(符号位)
  16. SF = 1, 显示为NG, 表示负数
  17. SF = 0, 显示为PL, 表示为正数
  18. 影响SF的指令举例, INC
  19. ZF标志位(零标志)
  20. ZF = 1, 显示为ZR
  21. ZF = 0, 显示为NZ
  22. 影响ZF的指令举例, XOR
  23. AF标志位(半进位)
  24. AF = 0, 显示为NA
  25. AF = 1, 显示为AC
  26. 影响AF的指令举例, INC
  27. PF标志位(奇偶标志位)
  28. PF = 1, 显示为PE
  29. PF = 0, 显示为PO
  30. 影响PF的指令举例, INC
  31. CF 标志位(进位标志)
  32. CF = 1, 显示为 CY
  33. CF = 0, 显示为 NC
  34. 影响CF的指令举例, CLC, STC

作业

Reg == 1 ? 1 : 0
mov ax,Reg
neg ax
sbb ax,ax

0. 无分支实现以下三目运算
Reg == 0 ? 0 : -1

  1. Reg == 0 ? 0 : -1
  2. mov cx,Reg
  3. neg cx
  4. sbb cx,cx

Reg == 1 ? 1 : 0

  1. Reg == 1 ? 1 : 0
  2. mov cx,Reg
  3. inc cx
  4. neg cx
  5. adc cx,cx

Reg == 8 ? 9 : 8

  1. Reg == 8 ? 9 : 8
  2. mov dx,Reg
  3. sub dx,8
  4. neg dx
  5. sbb dx,dx
  6. add dx,9

Reg == 6 ? 8 : 9

  1. Reg == 6 ? 8 : 9
  2. mov dx,Reg
  3. sub dx,6
  4. neg dx,dx
  5. adc dx,8

1 选择指令实现下列要求,OPN1 ← OPN2的含义:把操作数OPN2的值传送给OPN1。
1)、SI ← BX mov si,bx
2)、AL ← BH mov al,bh
3)、AX ← 13AH mov ax,13
4)、SI ← 1000H mov si,1000
5)、BX ← CL mov bl,cl
6)、DS ← AX mov ds,ax
7)、AL ← 12H mov al,12
8)、CX ← 0CDH mov cx,0cd (假设0CDH为无符号数)

5 写出下列指令序列中每条指令的执行结果,请在Debug环境下验证之,并注意各标志位的变化情况。
MOV BX, 23ABH 标志位无变化,bx变为23a
ADD BL, 0ACH error
MOV AX, 23F5H 标志位无变化,ax变为23F5
ADD BH, AL bh,al初始值为0xab和0x00,标志位无变化
SBB BX, AX bx,ax初始值为23ab,ax初始值为0000,标志位无变化
ADC AX, 12H 结果为ax=12h,奇偶标志位置一
SUB BH, -9 bh变为2cab,CF为变为1,PF=0,AF=1,

6 假定DS=1123H,SS=1400H,BX=0200H,BP=1050H,DI=0400H,SI=0500H,
LIST的偏移量为250H,试确定下面各指令访问内存单元的地址。
1)、MOV AL, [1234H] 112310h+1234h
2)、MOV AX, [BX] 1123
10h+200h
3)、MOV [DI], AL 112310h+400h
4)、MOV [2000H], AL 1123
10h+2000h
5)、MOV AL, [BP+DI] 112310h+1050+0400
6)、MOV CX, [DI] 1123
10h+400h
7)、MOV EDX, [BP] 123*10h+1050h
8)、MOV LIST[SI], EDX ?
9)、MOV CL, LIST[BX+SI] ?
10)、MOV CH, [BX+SI] ch变为0x00,标志位无变化
11)、MOV AL, [BP+SI+200H] 标志位无变化
12)、MOV AL, [SI-0100H] 标志位无变化
13)、MOV BX, [BX+4] 标志位无变化
8 用一条指令实现把BX和SI之和传送给CX。
lea [bx+si]
9 试比较下列三组指令的功能。

1)、LDS SI, [DI]
2)、MOV SI, [DI]
3)、MOV SI, [DI+2]
第一条指令的效果等于23条指令执行后的效果
10 标志位CF有着重要的作用,请简述之,并至少写出三种把CF置0的方法。

  1. 算术运算无进位
  2. 先将ah最低位置0,再用SAHF指令将ah的数据传入psw中的低8位
  3. 先将ax最低位置0,再用push指令将ax数据入栈,再用popf将刚刚ax入栈数据给psw,使得cf位置0