1.数据传送类指令
2.算术运算类指令
3.位操作类指令
4.串操作类指令
5.控制转移类指令
6.处理器控制类指令
数据传送类指令
- 传送指令MOV
- 把一个字节或字的操作数从源地址传送至目的地址。
- 注意:不存在存储器想存储器的传送指令。
- 交换指令XCHG(exchange)
情形
- 寄存器与寄存器直接对换数据
- 寄存器与存储器之间对换数据
- 不能在存储器与存储器之间对换数据
- 效率:xchg优于mov,因为xchg使用了内部暂存器。
- 举例:
- al,ah高低交换
- 存储器[2040]与[2050]交换
- 换码指令XLAT
- 作业:将BX指定的缓冲区中,AL指定的位移处的一个字节取出赋给AL。 即: al <— ds:[bx+al]
- 该指令无操作数
- 用途:键盘的扫描码,需要转为ASCII码,可以将扫描码做成表,扫描码作下标可以查到对应的ASCII码。
DosBox示例:
mov bx,0
mov al,3
xlat
mov al,4
mov al,a
xlat
堆栈操作指令
- 进栈(push reg)
- sub sp,2
- mov [sp],reg
- 出栈(pop reg)
- mov reg,[sp]
- add sp,2
- 保存所有寄存器环境
- 标志寄存器传送指令用来传送标志寄存器FLAGS的内容,方便进行对各个标志位的直接操作。
- 有2对4条指令
- 低8位传送:LAHF和SAHF
- 16位传送:PUSHF和POPF
地址传送指令
- 地址传送指令将存储单元的逻辑地址送至指定的寄存器
- 有效的地址传送指令LEA
- 指针传送指令LDS和LES
- 注意不是获取存储单元的内容
DosBox示例
-e ds:5566 “hello”
-a
mov bx,2233
mov ax,[bx+3333]
lea cx,[bx+3333]
- 注意不是获取存储器单元的内容
输入输出指令
- 8086通过输入输出指令与外设进行数据交换;呈现给程序员的外设是端口(port) 即I/O地址。
- 8086用于寻址外设端口的地址线为16条,端口最多为2^16=65536(64k)个,端口号为0000H~FFFFH
- 每个端口用于传送一个字节的外设数据
算术运算类指令
- 四则运算是计算机经常进行的一种操作。算术运算指令实现二进制(和十进制)数据的四则运算。
- 请注意算术运算类指令对标志的影响。
- 掌握:ADD/ADC/INC SUB/SBB/DEC NEG/CMP
- 熟系: MUL/IMUL、DIV/IDIV
- 理解: CBW/CWD、DAA/DAS、AAA/AAS/AAM/AAD
- 加法
- add:加法
- adc:带进位加法
- inc:加一,不影响CF标志位
编写汇编资料计算加法:
- 76543218
- +fa23fnc3
=170782ddb
减法
- sub减法
- sbb带借位的减法
- DEC-1,不影响CF位
编写汇编指令计算减法:
- 70782DDB
- -76543218
=70782DD8
求补指令NEG(negative)
- NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数
- 求补运算也可以表达成:将操作数按位去反后加1
- neg ax;如果ax=0,则CF标志位=0;若ax!=0,则CF=1
debug中的标志位显示顺序
OF DF IF SF ZF AF PF CF
OF 标志位(溢出)
OF = 1, 显示为OV
OF = 0, 显示为NV
影响OF的指令举例, INC
DF 标志位(方向)
DF = 0, 显示为UP
DF = 1, 显示为DN
影响DF的指令举例, CLD, STD
IF 标志位(中断)
IF = 0,显示为DI
IF = 1, 显示为EI
影响IF的指令举例, CLI, STI
SF 标志位(符号位)
SF = 1, 显示为NG, 表示负数
SF = 0, 显示为PL, 表示为正数
影响SF的指令举例, INC
ZF标志位(零标志)
ZF = 1, 显示为ZR
ZF = 0, 显示为NZ
影响ZF的指令举例, XOR
AF标志位(半进位)
AF = 0, 显示为NA
AF = 1, 显示为AC
影响AF的指令举例, INC
PF标志位(奇偶标志位)
PF = 1, 显示为PE
PF = 0, 显示为PO
影响PF的指令举例, INC
CF 标志位(进位标志)
CF = 1, 显示为 CY
CF = 0, 显示为 NC
影响CF的指令举例, CLC, STC
作业
Reg == 1 ? 1 : 0
mov ax,Reg
neg ax
sbb ax,ax
0. 无分支实现以下三目运算
Reg == 0 ? 0 : -1
Reg == 0 ? 0 : -1
mov cx,Reg
neg cx
sbb cx,cx
Reg == 1 ? 1 : 0
Reg == 1 ? 1 : 0
mov cx,Reg
inc cx
neg cx
adc cx,cx
Reg == 8 ? 9 : 8
Reg == 8 ? 9 : 8
mov dx,Reg
sub dx,8
neg dx
sbb dx,dx
add dx,9
Reg == 6 ? 8 : 9
Reg == 6 ? 8 : 9
mov dx,Reg
sub dx,6
neg dx,dx
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] 112310h+200h
3)、MOV [DI], AL 112310h+400h
4)、MOV [2000H], AL 112310h+2000h
5)、MOV AL, [BP+DI] 112310h+1050+0400
6)、MOV CX, [DI] 112310h+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的方法。
- 算术运算无进位
- 先将ah最低位置0,再用SAHF指令将ah的数据传入psw中的低8位
- 先将ax最低位置0,再用push指令将ax数据入栈,再用popf将刚刚ax入栈数据给psw,使得cf位置0