8086指令系统之算术运算类指令
- 格式:doc
- 大小:54.50 KB
- 文档页数:5
寻址方式指令系统
数据传送指令算术运算指令逻辑运算指令串操作指令
控制转移指令处理器控制指令
通用传送指令
累加器专用传送指令
地址传送指令
标志传送指令
对标志位的影响: 除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
数据传送指令算术运算指令逻辑运算指令串操作指令
控制转移指令处理器控制指令
实现二进制
所有算术运算指令均所有算术运算指令均
四则运算是计算机经常进行的一种操作。
请注意算术运算指令对
只有一个操作数:寄存器或存储单元对操作数加
用于计数器和地址指针的调整
不影响进位
对操作数减
用于计数器和地址指针的调整不影响进位。
实验名称实验三 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内容。
8086 8088 汇编指令手册一、常用指令二、算术运算指令三、逻辑运算指令四、串指令五、程序跳转指令------------------------------------------计算机寄存器分类简介:32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
对低16位数据的存取,不会影响高16位的数据。
这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。
可用于乘、除、输入/输出等操作,使用频率很高;寄存器EBX称为基地址寄存器(Base Register)。
它可作为存储器指针来使用;寄存器ECX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器EDX称为数据寄存器(Data Register)。
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
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 虽然对标志的影响没有定义,但是却可能产生溢 可能产生溢 可能产生 出。