8086指令系统之算术运算类指令
ch3-3 8086指令系统(算术运算与逻辑运算)

AH为高8位,AL为低8位。
AL (8位)
s (8位)
AH AL (16位)
第三章 8086/8088 指令系统
b. 16位乘法 AL×OPRD AX DX为高16位,AX为低16位。
AX (16位)
s (16位)
DX AX (32位)
第三章 8086/8088 指令系统
• 该指令可以得到负数的绝对值。 • 执行该指令后一般都会使得CF为1
第三章 8086/8088 指令系统
(5) 比较指令 CMP d, s
功能:作一次减法运算d–s,但不送结果,
只根据结果设置标志位。 比较指令往往用于判断两数是否相 等,或两数大小关系。若相等,则零标 志ZF=1。
第三章 8086/8088 指令系统
01110011 00110111 相减
00111100 00000110 调整
00110110
最后结果 AL = 00110110B(代表36),CF=0
第三章 8086/8088 指令系统
(5) AAM 功能:对未组合型BCD的乘法结果进行调整。 例: MOV AL, 00001000B (代表8) MOV BL, 00001001B (代表9) MUL BL AAM
否则不作调整。
第三章 8086/8088 指令系统
例: MOV AH, 0 MOV AL, 00000110B ADD AL, 00000111B
AAA
;代表6 ;代表7
00000110 6 + 00000111 7
00001101 调整 + 00000110
00010011
清0
00000011 AL 00000000+1=00000001AH
04 8088(8086)的指令系统

INC OPRD
操作数:通用寄存器、存储器 (不能是段寄存器或立即数) 执行的操作:OPRD OPRD + 1
功能: 用于在循环中修改地址指针及循环次数等。
注:该指令影响标志位
例: INC BX INC byte ptr [SI]
1. 先将SP所指单元内容 送至AL, 然后 SP+1SP ;
2. 再SP所指单元内容送 至AH, 然后 SP+1 SP
例:MOV AX,5678H POP AX
(3) 交换指令 XCHG OPRD1, OPRD2
在寄存器间或寄存器与存储器间交换信息(不允许使用段寄存器)。
源操作数: 寄存器、存储器 目的操作数:寄存器、存储器 执行的操作:( OPRD1) (OPRD2 )
DS=1000h
buffer 10100h 00 02 00 20
0100h BX
(2) LDS 把源操作数指定的内存的4个相继字节的内容送至指定寄存器及DS中
LDS REG, SRC
(REG) (SRC)
(DS) (SRC+2)
目的操作数
源操作数
(16位通用寄存器) (内存操作数)
• 该指令完成一个32位地址指针的传送; • 该指令通常指定 SI 作寄存器 REG。
• CPU内部寄存器之间的数据传送(除CS,IP外) MOV AL,BL MOV DX, DI MOV SI, BP MOV DS, BX MOV AX,DX
• 立即数传送到CPU内部通用寄存器组(AX,BX,CX,DX,BP,SP,DI,SI)
MOV CL, 4 MOV DX, 03FFH MOV DI, 04BFH
DST+SRC+C
8086CPU指令系统

3.3.2 算术运算类指令
1.加法指令
(2)带进位加法指令ADC
【指令格式】ADC dst,src 【指令功能】(dst) ← (dst)+(src)+(CF) ADC指令在格式和功能上都与ADD指令类似,只是相加时要 把进位标志CF的当前值加到和中,结果送到目的操作数中。 【用途】ADC指令主要用于多字节加法运算。 例如,有两个4字节的无符号数相加,由于8086加法指令最 多只能进行16位的加法运算,我们可将加法分两次进行,先 进行低16位相加,然后再进行高16位相加,在完成高16位 相加时,注意要把低16位相加时可能出现的进位位加进去。
•堆栈操作指令PUSH和POP
由于堆栈顶部是浮动的,为了指示现在堆栈中存放数据的位 置,通常设置一个指针,即堆栈指针SP,始终指向堆栈的顶部。 这样,堆栈中数据的进出取决于SP。当将数据(1个字节)推 入堆栈时,SP自动减1,向上浮动而指向新的栈顶;当将数据 从堆栈弹出时,SP自动加1,向下浮动而指向新的栈顶。 堆栈有建栈、进栈和出栈3种基本操作。 ⑴建栈
出栈操作都是以字为单位的,即每次在堆栈中存取数据均是两 个字节(先存入高字节,再存入低字节,仍然遵循“高字节在 高地址,低字节在低地址”的原则)。
【指令格式】PUSH opr 【指令功能】PUSH指令将16位的源操作数推入堆栈,而目标
地址为当前栈顶,即由SP指示的单元。PUSH指令操作如下: ①(SP)←(SP)-2 ②((SP)+1: (SP) ) ← opr
③代码段寄存器CS和指令指针寄存器IP不能作为目的 操作数,但CS可以作为源操作数.
④立即数不能作为目的操作数. ⑤不能用立即寻址方式给段寄存器传数. ⑥段寄存器之间不能用MOV指令直接传送. ⑦在传送字单元时,遵循“高字节在高地址,低字节在 低地址”的原则。
第3章 8086指令系统-汇编语言程序设计教程-陆遥-清华大学出版社

直接寻址方式可以利用变量名的偏移地址属性来 描述操作数的偏移地址(可直接用变量名,或将 变量名置于方括号[ ]中),段寄存器默认为DS。 如果实际使用的段寄存器不是DS,则必须用段 前缀明确指出。
【例3.7】设数据段内有如下变量定义语句
VAR DB 76H,5CH,0A3H,08H
分析以下指令的执行结果。
3.1 指令系统基本概念
指令是给计算机下达的一个简单操作任务,CPU 所能执行的所有指令构成了一个计算机的指令系 统(也称指令集)。
汇编语言指令是对机器指令的符号化表示,采用 助记符来表示指令的操作功能和操作对象。
指令通常可以分为以下几类:
⑴ 数据传送类指令。 ⑵ 算术运算类指令。
⑸ 程序控制类指令。 ⑹ 处理器控制类指令。
【例3.3】要求将数据68传送给AL寄存器,写出相应的传 送指令。 分析:由于AL寄存器接收数据,所以目的操作数为AL, 采用寄存器寻址方式,而源操作数为常数68,采用立即寻 址方式
MOV AL,68 ;AL←68
【例3.4】设被加数存于寄存器DX中,加数为512,写出相 应的加法指令。 分析:因为被加数由寄存器DX提供,所以DX为目的操作 数,采用寄存器寻址方式,而加数为常数512,采用立即 寻址方式
操作数。
2. ADD指令
指令格式:ADD DST,SRC 指令功能:DST←(DST)+(SRC) 。执行加法运算。 操作数特点:两个操作数。被加数DST为目的操作数,加
数SRC为源操作数。
3. NOT指令
指令格式:NOT OPR 指令功能:OPR←(OPR) 。执行逻辑非运算。 操作数特点:一个操作数。OPR既是目的操作数,也是源
段地址由段寄存器提供,用段前缀(DS:,ES:, CS:或SS:)来指明;偏移地址(亦称有效地址) 则有多种表示形式,由此形成了不同的存储器寻 址方式。
第三章 指令系统--指令

寻址方式指令系统
数据传送指令算术运算指令逻辑运算指令串操作指令
控制转移指令处理器控制指令
通用传送指令
累加器专用传送指令
地址传送指令
标志传送指令
对标志位的影响: 除SAHF和POPF指令外,其余的所有数据传送类指令
格式:
功能:
操作数类型:
DS,100H
用
堆栈:执行
PUSH
POP
SS指向堆栈段的起始位置SP指定栈顶
PUSH AX PUSH DS POP DS POP AX
格式:
oprd1,
立即数、段寄存器和
不影响
通用传送指令
累加器专用传送指令地址传送指令
标志传送指令
LEA (Load Effective Address)
LDS (Load pointer into register and DS) LES (Load pointer into register and ES)
LEA LEA
LEA
数据传送指令算术运算指令逻辑运算指令串操作指令
控制转移指令处理器控制指令
实现二进制
所有算术运算指令均所有算术运算指令均
四则运算是计算机经常进行的一种操作。
请注意算术运算指令对
只有一个操作数:寄存器或存储单元对操作数加
用于计数器和地址指针的调整
不影响进位
对操作数减
用于计数器和地址指针的调整不影响进位。
48086CPU指令系统

XCHG DS,ES XCHG AX,DS XCHG DS,[ BX ] • 不能使用双存储器 XCHG [ BX ],[ SI ] • 不能使用立即数 XCHG AX,2000H XCHG 20H,BL
《例》用 MOV、PUSH,POP、XCHG 指令 完成两寄存器AX、BX 中数据的交换
• 指令格式
•
指令功能
OPR1、OPR2 两个操作数间交换数据
数据传送类指令
XCHG指令的应用范围
• 通用寄存器与通用寄存器间交换数据
XCHG AX,BX XCHG DL,CH • 通用寄存器与存储器间交换数据 XCHG AX,[ BX ] XCHG [ SI ],AL
数据传送类指令
XCHG指令的 禁用情况
通用传送指令 PUSH、POP 中 src、dst 操作数的使用
• 为通用寄存器、段寄存器操作数
PUSH AX、PUSH ES POP DS、 POP BX • 为存储器操作数 PUSH [ 2000H ]、PUSH [ BX ] POP [ BX ]、 POP [ 1000H ]
通用传送指令PUSH、POP中 src、dst 操作数的禁用
数据传送类指令
指令 LEA 与 LDS,LES 的区别
• LEA src
scr 表示存储器地址本身
• LDS r,src
LES r,src src 表示存储器地址中的值
地址传送指令的比较
已知:DS=09A0H,BX= 0048H
LEA DI,[BX] → 执行后:DI=0048H 等价于 MOV DI,OFFSET [BX] LDS DI,[BX] → 执行后:DI=003EH DS=0816H LES DI,[BX] → 执行后:DI=003EH ES=0816H Memory
实验三 8086 常用指令练习

实验名称实验三 8086 常用指令练习一、实验目的1、通过实验掌握常用数据传送指令、算术运算指令。
2、MOV、XCHG、ADD、ADC、SUB、SBB等常用指令的使用。
二、实验要求1、16进制数加减法手算结果及实验结果。
2、8086 常用指令练习部分的逐条运行记录,思考结果及自编程序运行记录。
三、实验环境DOS操作系统。
四、实验内容1、传送指令1)用A命令在内存100H处键入下列内容:MOV AX,1234MOV BX,5678XCHG AX,BXMOV AH,35MOV AL,48MOV DX,75ABXCHG AX,DX图1在内存100处键入指令2)用U命令检查键入的程序并记录,特别注意左边的机器码。
图2用U命令检查键入3)用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况。
并注意标志位有无变化。
图3 T命令逐条运行图4 T命令逐条运行图5 T命令逐条运行2、加减法指令:1)用A命令在内存200H处键入下列内容:MOV AH,34MOV AL,22ADD AL,AHSUB AL,78MOV CX,1284MOV DX,5678ADD CX,DXSUB CX,AXSUB CX,CX图6在内存200处键入指令3)用U命令检查键入的程序及对应的机器码。
图7用U命令检查键入4)用T命令逐条运行这些指令,检查并记录有关寄存器及ZF 情况。
图8 T命令逐条运行图9 T命令逐条运行图10 T命令逐条运行ZF无变化思考:这次运行还是打入T,行不行?怎么办?用R命令检查一下IP的内容。
注意T命令与IP的关系。
3、带进位加减法:1)用A命令在内存300H处键入下列内容,并用U命令检查:MOV AH,12MOV AL,84MOV CH,56MOV CL,78ADD AL,CLADC AH,CHMOV DH,A7MOV DL,58SUB DL,7FSBB DH,34图11在内存300处键入指令图12用U命令检查键入2)用T命令逐条运行这些指令,检查并记录有寄存器及CF内容。
2_第3章 8086指令系统_加减运算指令比较指令52

3.4.2 算术运算指令
算术运算指令涉及两种类型数据,即无符号数和有符号数 对加法指令和减法指令而言,无符号和有符号数可采用同
一套指令,其先决条件有两个: 一是参加的操作数必须同为无符号数或同为有符号数 二是要采用不同标志位来检查无符号数和有符号数的 运算结果是否溢出
而乘除运算指令则需要区分无符号数和有符号数
11 11
ADC指令的使用价值
主要用于由于数据较大(多字节),需要多次运算的加法 运算中。 例:有两个4字节的无符号数相加:
2D568F8CH+3C9E489BH=? 设 被加数存放在BUF1开始的存储区内
加数存放在BUF2开始的存储区内 要求和放回BUF1存储区 假设CPU进行8位的加法运算,为此将进行4次加法运算
.386
……
MOVZX AX, A
MOVZX BX, B
ADD
AX, BX
MOVZX BX, C
ADD
AX, BX
MOV
SUM, AX
;取第一个数,扩展0传送 ;取第二个数 ;加第二个数 ;取第三个数 ;加第三个数 ;保存三个数的和
20 20
[例] P,Q,R均为8位有符号数,求它们的和,送入TOTAL
这个问题的另一种方法:
MOV AL, A
;取第一个数
MOV AH, 0
;高8位清零,准备存放和的高8位
ADD AL, B
;加第二个数
ADC AH, 0
;如果有进位,存入AH
ADD AL, C
;加第三个数
ADC AH, 0
;如果有进位,加入AH
MOV SUM, AX ;保存三个数的和
19 19
这个问题的第三种方法:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8086 指令系统之算术运算类指令 2007-04-17 07:51 1 加法指令 1.1 加法指令 ADD ADD reg,imm/reg/mem ;reg←reg+imm/reg/mem ADD mem,imm/reg ;mem←mem+imm/reg 2.17a: 例 2.17a:加法运算 mov add mov mov add add al,0fbh ;al=0fbh al,07h ;al=02h word ptr[200h],4652h ;[200h]=4652h bx,1feh ;bx=1feh al,bl ;al=00h word ptr[bx+2],0f0f0h ;[200h]=3742hADD 指令按照状态标志的定义相应设置这些标志的 0 或 1 状态。
例如 在 07+FBH→02H 运算后:标志为 OF=0、SF=0、ZF=0、AF=1、PF=0、CF=1;用调 试程序单步执行后,上述标志状态依次为 NV、PL、NZ、AC、PO、CY。
同样进行 4652h+f0f0h→3742H 运算后,标志为 OF=0、SF=0、ZF=0、 AF=0、PF=1、CF=1;调试程序依次显示为 NV、PL、NZ、NA、PE、CY。
注意,PF 仅反映低 8 位中“1”的个数,AF 只反映 D3 对 D4 位是否有进位。
1.2 带进位加法指令 ADC ADC reg,imm/reg/mem ;reg←reg+imm/reg/mem+CF ADC mem,imm/reg ;mem←mem+imm/reg+CF ;mem←mem+imm/reg+CF 加法运算外, CF, ADC 指令除完成 ADD 加法运算外,还要加进位 CF,其用法及对状态标志的 指令一样。
影响也与 ADD 指令一样。
ADC 指令主要用于与 ADD 指令相结合实现多精度 数相加。
数相加。
2.17b: 例 2.17b:无符号双字加法运算 mov ax,4652h ;ax=4652h add ax,0f0f0h ;ax=3742h,CF=1 mov dx,0234h ;dx=0234h adc dx,0f0f0h ;dx=f325h,CF=0 上述程序段完成 DX.AX = 0234 4652H + F0F0 F0F0H = F325 3742H。
1.3 增量指令 INC INC reg/mem ;reg/mem←reg/mem+1 增量)。
INC 指令对操作数加 1(增量)。
inc bx inc byte ptr[bx] 设计加 1 指令和后面介绍的减 1 指令的目的, 主要是用于对计数器和地 用于对计数器和地 址指针的调整,所以它们不影响进位 CF 标志,对其他状态标志位的影响与 ADD、 址指针的调整 ADC 指令一样。
2 2.1 减法指令 减法指令 SUB ;reg←regSUB reg,imm/reg/mem ;reg←reg-imm/reg/mem SUB mem,imm/reg ;mem←mem-imm/reg ;mem←mem2.18a: 例 2.18a:减法运算 mov al, 0fbh ;al=0fbh sub al, 07h ;al=0f4h,CF=0 mov word ptr [200h],4652h ;[200h]=4652h mov bx,1feh ;bx=1feh sub al,bl ;al=0f6h,CF=1 sub word ptr [bx+2],0f0f0h ;[200h]=5562h,CF=1 2.2 带借位减法指令 SBB ;reg←reg-imm/reg/memSBB reg,imm/reg/mem ;reg←reg-imm/reg/mem-CF ;mem←mem-imm/regSBB mem,imm/reg ;mem←mem-imm/reg-CF该指令使目的操作数减去源操作数,还要减去借(进)位 CF,结果送 到目的操作数。
SBB 指令主要用于与 SUB 指令相结合实现多精度数相减。
指令相结合实现多精度数相减。
SBB 2.18b: 例 2.18b:无符号双字减法运算mov ax,4652h ;ax=4652h sub ax,0f0f0h ;ax=5562h,OF=0、SF=0、ZF=0、AF=0、PF=0、CF=1 mov dx,0234h ;dx=0234h sbb dx,0f0f0h ;dx=1143h,OF=0、SF=0、ZF=0、AF=0、PF=0、CF=1上述程序段完成 DX.AX = 0234 4652H-F0F0 F0F0H = 1143 5562H。
2.3 减量指令 DEC ;reg/mem←reg/memDEC reg/mem ;reg/mem←reg/mem-1 减量)。
)。
同 DEC 指令对操作数减 1(减量)。
INC 指令一样,DEC 指令不影响 CF,但影响 其他状态标志。
dec cx dec word ptr[si]2.4求补指令 NEG ;reg/mem←0NEG reg/mem ;reg/mem←0-reg/mem指令对操作数执行求补运算,即用零减去操作数,然后结果返回操作 NEG 指令对操作数执行求补运算 数。
NEG 指令对标志的影响与用零作减法的 SUB 指令一样。
2.19: 例 2.19:求补运算mov ax,0ff64h neg al ;ax=ff9ch,OF=0、SF=1、ZF=0、PF=1、CF=1 sub al,9dh ;ax=ffffh,OF=0、SF=1、ZF=0、PF=1、CF=1 neg ax ;ax=0001h,OF=0、SF=0、ZF=0、PF=0、CF=1 dec al ;ax=0000h,OF=0、SF=0、ZF=1、PF=1、CF=1 neg ax ;ax=0000h,OF=0、SF=0、ZF=1、PF=1、CF=0 2.5 比较指令 CMP;reg regCMP reg,imm/reg/mem ;reg-imm/reg/mem ;memCMP mem,imm/reg ;mem-imm/reg该指令将目的操作数减去源操作数,但结果不回送目的操作数。
该指令将目的操作数减去源操作数,但结果不回送目的操作数。
也就是 说 CMP 指令与减法指令 SUB 执行同样的操作,同样影响标志,只是不改变目的操 作数。
指令用于比较两个操作数的大小关系。
CMP 指令用于比较两个操作数的大小关系。
执行比较指令之后,可以根据 标志判断两个数是否相等、 大小关系等。
所以, CMP 指令后面常跟条件转移指令, 根据比较结果不同产生不同的分支。
例 2.20:比较 AL 是否大于 100 2.20: cmp al ,100 ;al-100 jb below ;al<100,跳转到 below 执行 sub al,100 ;al≥100,al←al-100 inc ah ;ah←ah+1 below: ... 3 乘法指令 3.1 无符号数乘法指令 MUL ;无符号字节乘 无符号字节乘: MUL r8/m8 ;无符号字节乘:AX←AL×r8/m8 ;无符号字乘 无符号字乘: MUL r16/m16 ;无符号字乘: DX.AX←AX×r16/m16 DX.AX←AX×r16/m16 CF。
如果乘积的高一半 (AH 或 DX) 0, OF=CF=0; 为 则 MUL 指令影响标志 OF 和 CF。
否则 OF=CF=1。
利用乘法指令对 OF 和 CF 的影响,可以判断相乘的结果中高一半 是否含有有效数值。
但是,MUL 指令对其他状态标志的影响没有定义,也就是成 为任意,不可预测。
2.21a: 例 2.21a:无符号数 0B4H 与 11H 相乘 mov al,0b4h ;al=b4h=180d mov bl,11h ;bl=11h=17d mul bl ;ax=Obf4h=3060d,OF=CF=1(AX 高 8 位不为 0) 3.2 有符号数乘法指令 IMULIMUL r8/m8 ;有符号字节乘:AX←AL×r8/m8 ;有符号字节乘: 有符号字节乘 ;有符号字乘 有符号字乘: IMUL r16/m16 ;有符号字乘: DX.AX←AX×r16/m16 IMUL 指令对 OF 和 CF 的影响是:若乘积的高一半是低一半的符号扩展, 则 OF=CF=0;否则均为 1。
它仍然用于判断相乘的结果中高一半是否含有有效数 值。
IMUL 指令对其他标志没有定义。
2.21b 1b: 例 2.21b:有符号数 0B4H 与 11H 相乘 mov al,0b4h ;al=b4h=-76d mov bl,11h ;bl=11h=17d imul bl ;ax=faf4h=-1292d,OF=CF=1 ;AX 高 8 位不是低 8 位的符号扩展,表示含有有效数字 计算二进制数乘法:b4h×11h。
如果把它当作无符号数,用 MUL 指令结 果为 0bf4h;如果看作是有符号数,用 IMUL 指令则结果为 faf4h。
由此可见,同 样的二进制数看作无符号数与有符号数相乘,即采用 MUL 与 IMUL 指令,它们的 结果是不相同的。
4 除法指令 4.1 无符号数除法指令 DIV;无符号字节除 无符号字节除: DIV r8/m8 ;无符号字节除:AL←AX÷r8/m8 的商, 的商, ;AH←AX÷r8/m8 的余数 ;无符号字除 无符号字除: DIV r16/m16 ;无符号字除: 的商, AX←DX.AX÷r16/m16 的商, ;DX←DX.AX÷r16/m16 的余数 2.22a 22a: 例 2.22a:无符号数 0400H 除以 B4H mov ax,0400h ;ax=400h=1024d mov bl,0b4h ;bl=b4h=180d div bl ;商 al=05h,余数 ah=7ch=124d 4.2 有符号数除法指令 IDIV;有符号字节除 有符号字节除: IDIV r8/m8 ;有符号字节除:AL←AX÷r8/m8 的商, 的商, ;AH←AX÷r8/m8 的余数 r16/m16 ;有符号字除 有符号字除: IDIV r16/m16 ;有符号字除: 的商, AX←DX.AX÷r16/m16 的商, ;DX←DX.AX÷r16/m16 的余数 2.22b: 例 2.22b:有符号数 0400H 除以 B4H mov ax,0400h ;ax=400h=1024d mov bl,0b4h ;bl=b4h=-76didiv bl ;商 al=f3h=-13d,余数 ah=24h=36d 除法指令 DIV 和 IDIV 虽然对标志的影响没有定义,但是却可能产生溢 可能产生溢 可能产生 出。