内容为上课内容整理,用于笔记记录,觉得很好。题目为课后练习题,答案不一定正确。
文章还会重新修改和添加!
目录
加法指令
(1)ADD(add)不带进位加法指令
指令格式: ADD DST,SRC ;B/W
执行的操作:DST←(DST)+(SRC)
注意:
1)两个存储器操作数不能直接相加,即DST和SRC不能同时为存储器操作数。许多指令都有这种规定(MOVS、CMPS除外);
2)段寄存器也不可作为DST和SRC。
3)该指令执行结果全面影响状态标志:OF、SF、ZF、AF、PF、CF。
(2)ADC (add with Carry) 带进位加法指令
指令格式: ADC DST,SRC ;B/W
执行的操作:DST←(DST)+(SRC)+CF
(3). INC(increment)加1指令
指令格式:INC OPR ;B/W
执行的操作:OPR←(OPR)+1
其中OPR代表的既是源操作数也是目的操作数。
注意事项:
1) OPR只能是寄存器与存储器操作数,不允许使用立即数和段寄存器做为操作数;
2) INC指令影响除CF以外的其他状态标志。
合法的指令:
INC AX
INC BL
INC WORD PTR [2000H]
非法的指令:
INC 200
INC DS
减法指令 SUB、SBB、DEC、NEG、CMP
(1)SUB (Subtract)不带借位的减法指令
指令格式: SUB DST,SRC ;B/W
执行的操作:DST←(DST)―(SRC)
其中DST和SRC所代表的操作数寻址方式与ADD相同。
(4) NEG(Negate)求补指令
指令格式: NEG OPR ; B/W
执行的操作: (OPR)¬ 0 -(OPR)
(5).CMP(Compare)比较指令
指令格式:CMP OPR1,OPR2 ;B/W
执行的操作:(OPR1)-(OPR2)
(1)其实就是减法了啦!下面给个详细说明:
1. 类似SUB指令,但仅仅是形式上相减,它不保存结果(无真差可存)
OPR1和OPR2的内容 保持不变。
主要任务:全面影响状态标志,且与SUB有相同的置状态标志规律。
2. CMP指令之后,往往紧跟条件转移指令,根据比较结果使程序产生分支。OPR1和OPR2的寻址方式及语法约定分别与加、减指令中DST和SRC的规定相同。
比较指令主要用于比较两个操作数是否相等、大小等。这主要通过测试不同的标志位来判断两个操作数的关系。
(2)关于操作数格式到底是个啥?
上面说到和加、减指令相同,那就看看这个加法的规则来类比
乘法指令
(1)MUL(Unsigned MUL tiple)无符号数乘法指令
指令格式:MUL SRC ;B/W
SRC只可为reg和mem数据,不允许使用立即数和段寄存器。
例:MUL 30H 错
字节操作数相乘: AX←AL*(SRC) 8;
字操作数的相乘:(DX,AX)←AX*(SRC) 16。
【例】MOV AL,0FFH 十进制255
MOV BL,0FFH
MUL BL ;AX=255×255=65025
(2)IMUL(Signed MUL tiple)有符号数乘法指令
【例】 MOV AL,0FFH
MOV BL,0FFH
IMUL BL ;AX=(-1)×(-1)= 1
除法运算
(1)DIV(Unsigned divide)无符号数除法指令
指令格式:DIV SRC ;B/W
执行的操作: 除数是源操作数SRC
字节操作:被除数要求先放在AX中,作为隐含的目的操作数DST,相除结果8位商在AL中,8位余数在AH中。
AL← AX/(SRC)8的商
AH← AX/(SRC)8的余数
字操作的要求:32位被除数定要放在DX,AX中,其中DX为高位字,AX为低位字,相除结果的16位商在AX中,16位余数在DX中。表示为:
AX←(DX,AX)/SRC16的商
DX←(DX,AX)/SRC16的余数
本指令的结果:商和余数均为无符号数。对SRC的规定与乘法指令相同。
(2)IDIV(Signed divide)有符号数的除法指令
指令格式:IDIV SRC ;B/W
执行的操作:与DIV有相同形式,但其被除数、除数、商和余数均带有符号数,且余数的符号和被除数的符号相同。除法指令对所有的状态标志位均无定义。
用IDIV指令时,若是一个双字操作数除以一个字操作数,则商的范围可以在-32768~+32767;若是一个字操作数除以一个字节操作数,则商的范围为-128~+127。如果超出这个范围,那么会作为除数为0的情况来处理,即产生中断类型号为0的中断,即溢出中断INT0,而不是按照通常想法使溢出标志OF置1。
注意:在除法运算(IDIV、DIV)中,要求被除数的位数是除数位数的两倍,不足位的要进行扩展。IDIV指令要求用带符号的扩展,而DIV指令则直接加0补足位数即可。
练习题
1、判断题: 判断指令的正确性。CMP [SI],[DI] 错
2、执行以下两条指令后,标志寄存器FLAGS的六个状态位CF,ZF,SF,OF,PF各为( 10001 )
MOV AX,84A0H
ADD AX,9460H
1 1900H
(161条消息) 第二章:8086微处理器(全面考点+例题)_MSY~学习日记分享的博客-CSDN博客
两数同为正,相加,值为负,则说明溢出
两数同为负,相加,值为正,则说明溢出
正正得负则溢出,负负得正则溢出
两数相减,同号,则不溢出
两数相减,异号,结果与减数符号相同,则溢出。
5、下列指令错误的是() 。
A INC DX
B ADC DX,[SI]
C ADD AH,1010H
D ADD AL,[Dl+1010H]
6. 已知AX寄存器的内容为5678H,执行下面三条指令后,AX为 (0000)
MOV BX, AX
NEG BX
ADD AX, BX
首先将AX的内容复制到BX寄存器中,即BX=AX=5678H。
然后对BX寄存器取负数,即BX=-5678H。
最后将BX寄存器的值加到AX寄存器中,即AX=AX+BX=5678H-5678H=0。
7、假设AX= 57ADH, BX= 0D36AH, 指令ADD AX,BX执行后, AX= [ 2B17 ] ,标志位CF= [1]。
8、假设AX=38D2H,BX=815EH,CF=1, 指令ADC AX,BX执行后, AX= [BA31] ,标志位CF= [0]。
9、假设AX= 18D2H, BX=215EH,指令 SUB AX, BX 执行后, AX= [ -88C ] H。
10、判断题: 指令MOV DX, DS: [AX] 执行的结果是将数据段一个字单元的内容送给DX。对
11、假设AX=173DH , BX=736AH,指令 CMP AX,BX 执行后,
AX= [-5C2D ],CF= [填空2],
OF= [填空3],ZF= [填空4]
0001 0111 0011 1101 B - 0111 0011 0110 1010 B =
0001 0111 0011 1101 B + 1000 1100 1001 0100 B(补码)= 1010 0011 1101 0001=
13、(无符号) 执行以下程序段后,AX寄存器的内容为 [ FD02H ]。
MOV AL, 0FFH 十进制:255
MOV BL, 0FEH 十进制:254
MUL BL
MUL 指令将 AL 和 BL 中的数值相乘, 255×254=64770 D = FD02 H
由于 AX 是 16 位寄存器,因此需要将结果分成高 8 位和低 8 位分别存放在 AH 和 AL 中
14、(有符号) 执行以下程序段后,AX寄存器的内容为[ 0002H ]。
MOV AL, 0FFH 十进制:-1
MOV BL, 0FEH 十进制:-2
IMUL BL
2 D= 2 H