算术运算指令

合集下载

算术运算指令

算术运算指令
13
2. 减法指令
(1) 不考虑借位的减法指令SUB 格式: SUB dest, src 操作: dest←(dest)-(src)
注:1.源和目的操作数不能同时为存储器操作数 2.不能把段寄存器作为操作数
指令例子:
SUB AL,60H SUB [BX+20H],DX SUB AX,CX
14
(2) 考虑借位的减法指令SBB SBB指令主要用于多字节的减法。 格式: SBB dest, src 操作: dest←(dest)-(src)-(CF)
思考: 程序的结果? (AL、BL、CL中数据的大小顺序22 )
3. 乘法指令
进行乘法时: 8位 8位→ 16位乘积 (即 AL mem8/reg8 → AX) 16位 16位→ 32位乘积
(即 AX mem16/reg16 → DX AX) (1) 无符号数的乘法指令MUL mem/reg
9
BUFFER1
ACH F8H 56H 2CH
BUFFER2
BEH 47H 9EH 30H
被 加 数
数 据 段
加 数
...
多字节加法示意图
10
程序段如下:
MOV CX,4 ;置循环次数
MOV SI,0 ;置SI初值为零
CLC
;清进位标志CF
LL: MOV AL,BUFFER2[SI]
ADC BUFFER1[SI],AL ;带进位加
8
ADC指令主要用于多字节加法运算中
例:有两个4字节的无符号数相加: 2C 56 F8 AC + 30 9E 47 BE = ? 设被加数、加数分别存放在BUFFER1及
BUFFER2开始的两个存储区内,结果放回 BUFFER1存储区,如下页图所示。

算术运算类指令

算术运算类指令

2009年6月2日星期二
15
2.双寄存器符号扩展指令CWD/CDQ/CQO
指令格式:CWD
CDQ
CQO 功能:CWD功能为将AX寄存器的内容符号扩展到DX中;
CDQ指令的功能为将EAX寄存器的内容符号扩展到EDX中; CQO指令的功能为将RAX寄存器的内容符号扩展到RDX中,只 能在64位方式下使用。 它们都不影响标志位。 一般来说符号扩展指令大都与除法指令相结合,为达到被除数的位数要 求而扩展。 【例3.29】 求0ABCH÷0200H(带符号数相除) 由于除数为字,则必须将原来的被除数进行符号扩展后才能相除。
2009年6月2日星期二
10
AL ╳ src (8位源操作数)
AX
(16位乘积)
字节乘法
AX

src (16位源操作数)
DX AX 字乘法
(32位乘积)


src (32位源操作数)
EDX EAX (64位乘积)
RAX

src (64位源操作数)
RDX RAX (128位乘积)
32位乘法
64位乘法
【例】 设AX=65A0H,BX=B79EH,指令ADD BX,AX的执行情况如下:
0110010110100000 +)1011011110011110
10001110100111110
结果非零:ZF=0
最高位有进位:CF=1 最高位为0:SF=0
OF=最高位进位1⊕次高位进位1,则OF=0
无进位: AF=0 低8位为偶数个1:PF=0
状态标志位
OF SF ZF AF PF CF
Y **** Y Y **** Y Y **** Y Y **** Y

第3章(09.2)

第3章(09.2)

4.加1指令(5条) INC INC INC INC INC A Rn direct @Ri DPTR
指令功能:使操作数所指定的单元的内容加1 例:已知A=12H,R0=33H,(21H)=32H,(34H)=22H, DPTR=1234H,连续执行下面的指令。 说明:除了“INC A”影响奇偶标志位外,其余操作均 INC A 不影响PSW;“INC DPTR”是一条16位加1指令,这条 INC R0 指令在加1过程中,若低8位有进位可直接向高8位进位, INC 21H 不需要通过进位位Cy传送。 INC @R0 INC DPTR
4.清0与取反指令(2条) 取反: CPL A 5.循环移位指令(4条) RL A RR A RLC A RRC A 清零: C0
A.0 A.7 A.7 A.0 A.0
CY
CY
后两条指令,影响P标志和CY。
综合举例: 例1:把累加器A中的低4位状态,通过P1口的高4 位输出, P1口的低4位状态不变。 ANL A,#0FH ;屏蔽A的高4位 SWAP A ANL P1,#0FH ;清P1口高4位 ORL P1,A ;P1口高4位输出A的低4位; 例2:编制程序将存放在片外RAM的30H单元中某 数的低4位取反,高2位置1,其余2位清0。 例3:编制程序求片内RAM的20H,21H,22H单元 中的数的补码,并将结果仍放回到20H,21H, 22H中。
(40H)= (41H)=
H H
(50H) = (51H)=
H H
A= R0=
H H
5.减1指令(4条) DEC DEC DEC DEC A Rn direct @Ri
指令功能:使操作数所指定的单元的内容减1
说明:减1指令中没有DPTR减1指令.

3.3.2 算术运算类指令

3.3.2 算术运算类指令

1. 加法指令(s 代表源操作数,d 代表目标操作数)(1)不带进位的加法指令add d,ss和d相加的结果存入d。

(2)带进位的加法指令adc d,sS和d相加后再加上标志位CF,结果存入dAdd主要用来计算低位字加法,adc用来计算高位字加法,实现32位加法比如一个32位数,高16位存在dx中,低16位存在ax中另一个32位数,高16位置存在cx中,低16位存在bx中计算加法add ax,bxAdc dx,cx(3)加1指令inc d 则d=d+1Inc axInc bl2. 减法指令(1)不带借位的减法sub d, sd-s结果存入d(2)带借位的减法sbb d,sd-s-CF,结果存入d比如一个32位数,高16位存在dx中,低16位存在ax中另一个32位数,高16位置存在cx中,低16位存在bx中计算减法,第一个数减第二个数sub ax,bxsbb dx,cx(3)减1指令dec d 则d=d-1dec axdec bl(4)求补NEG d将d包括符号位在内各位取反,末位加1相当于d=0-d比如字节型-5计算机中存的是11111011求补后是00000101,即5比如字节型+7计算机中存的是00000111求补后是11111001即-7 (5)比较cmp d,s类似做减法sub,但不保存结果,只用来影响标志位,主要通过执行后的标志位来判断两个数的大小关系比如cmp ax,bx (类似做ax-bx)Jz label1 (JZ意思是两数相等则跳转, jmp if zf=1)3. 乘法指令(1)无符号数乘法(用于正数)Mul s (该指令隐含了操作数ax或al)s为无符号word型,将s与AX相乘,结果存入DX,AX;s为无符号byte型,将s与AL相乘,结果存入AX(2)有符号数乘法(用于负数)imul s (该指令隐含了操作数ax或al)s为有符号word型,将s与AX相乘,结果存入DX,AX;s为有符号byte型,将s与AL相乘,结果存入AX乘法指令影响of位和cf位,乘积结果用到高字(节)寄存器,则of=1,cf=1;没用到高字(节)寄存器(结果在8位或16位范围内) 则of=0,cf=0 书p974. 除法指令(隐含被除数在ax或dx,ax中)(1)无符号数除法Div sS为无符号byte型,则用ax/s ,商存在al中,余数存在ah中S为无符号word型,则用dx,ax/s,商存在ax中,余数存在dx中(2)有符号数除法idiv s和无符号数除法类似,用于有符号数假设用30001/2 ,代码如下Mov ax, 30001Mov bl, 2Div bl得到的是divide override,这样的情况暂不考虑,只考虑结果能够存放到相应寄存器中的情况(3)字节转换成字(隐含操作数为al)CBW将al中的符号位扩展到ah中,比如-5,mov al,-5<=> mov al, 11111011bal中的11111011b经cbw扩展后AX中为1111111111111011b;al存的如果是正数,直接在ah中存入00000000b(4)字转换成双字(隐含操作数为ax)Cwd (convert word to dword)和cbw类似,将ax中的符号位扩展到dx中。

第三节算术运算指令

第三节算术运算指令

1、 ADD(Addition)加法指令
指令格式:ADD dest , src ;(dest) (dest)+(src) Src:立即数,寄存器,存储器。 dest:寄存器,存储器。
例:
ADD CL,10 ADD DX,SI ADD AX, MEM ADD DATA[BX], AL ;寄存器+立即数 ;寄存器+寄存器 ;寄存器+存储器 ;存储器+寄存器
双高位判别法
(2)无符号数相加溢出 根据CF判断无符号数产生溢出? CF=1无符号数相加产生溢出,但考虑进位所代表的数 值后,结果并没有错。
(一)加法指令(Arithmetic)
8088具有5种加法操作指令:
1、 ADD(Addition)加法指令 2、 ADC(Add with carry)带进位加法指令 3、 INC(Increment by 1)加 1指令
SUB WORD PTRALPHA[BX][DI],512H;存储器减立即数
这种指令影响标志位: AF、CF、OF、PF、SF、ZF标志。
2、SBB(Subtraction with borrow)带进位减法指令 格式::SBB dest,src;(dest)←(dest)-(src)-CF CF: 进位标志CF的现行值(上条指令CF值)
;存储器+1(字操作)
INC WORD PTR [DI]
INC
DS
; 错
(二)减法指令(Subtraction)
8088有7条减法指令 :
1、SUB(Subtraction)减法指令
2、SBB(Subtraction with borrow)带进位减法指令 3、DEC(Decrement by 1 ) 减 1 指令 4、NEG(Negate) 求补指令 5、CMP(Compare) 比较指令

算术运算Arithmetic指令

算术运算Arithmetic指令

MOV AL,7
MOV BL,8
ADD AL,BL;(AL=0FH);
AAA;
(AH=1,AL=5) 连加?
打*指令一般了解
2
算术运算(Arithmetic)指令(4)
DAA*(Decimal adjust for Addition) 压缩BCD加法调整
(单字节)只对Packed BCD (00-99H) 有意义;
8位除法 DIV CL; DIV BYTE PTR [BX+1]
注意:
除0/溢出 (字节除: 商>255 OR 字:商>65535) 除零中断
默认AX/OPRD(字节) 结果 AH=余数 AL=商
7
算术运算(Arithmetic)指令(八)
IMUL/IDIV 有符号数乘/除法
CBW/CWD 符号扩展
INC BYTE PTR[BX]; INC WORD PTR CS:[DI+20]
1
算术运算(Arithmetic)指令(3)
AAA*(ASCII adjust for Addition) 非压缩BCD加法调整
(单字节)只对Unpacked BCD (00-09H)有意义;
隐含为:AL,AH(AH:00~08,AL:00~09) 等效:IF((AL)&(0FH)>9)OR (AF)=1 THEN (AL)+6; AH+1;AF=CF=1; (AL)&0FH ELSE (AL)&0FH; (应AH=00~08,AL=00~09) 例:MOV AH,0
9
逻辑运算与移位(Logical & shifting)
逻辑运算 . 8086/8088无直接位操作:

二、算术逻辑运算指令

二、算术逻辑运算指令

二、算术运算指令
• • • • • • • •
MOV ADD DA MOV MOV ADDC DA MOV
A,50H A,60H A 40H,A A,51H A,61H A 41H,A
;(A)←(50H) ;(A)←(A)+(60H) ;BCD码修正
二、算术运算指令 ⑷加1指令
• • • • • INC INC INC INC INC A Rn direct @Ri DPTR ;(A)←(A)+1 ;(Rn)←(Rn)+1 ;(direct)←(direct)+1 ;((Ri))←((Ri))+1 ;(DPTR)←(DPTR)+1
• 功能是将累加器A内容减去源地址单元内容,再减去 进位位Cy的内容,结果放入累加器A中 • 问题:如何应用此指令对两个单字节数相减?
二、算术运算指令
•主要用于多字节数的减法 如果要进行单字节或多字节数低8位数的减法运算,应先 清除进位位Cy。 • 对于PSW的影响CY、AC、OV、P • 例3-15:设累加器A的内容为0C9H,寄存器R2内容为 54H,进位标志Cy=1,执行指令:SUBB A,R2
二、算术运算指令
⑵减1 指令 • • • • DEC DEC DEC DEC A ;(A)←(A)-1 Rn ;(Rn)←(Rn)-1 direct ;(direct)←(diect)-1 @Ri ;((Ri))←((Ri))-1
• 注:执行结果只影响PSW的奇偶校验位P (以A为操 作数时 )
二、算术运算指令
二、算术运算指令
• (3) 二-十进制调正指令(BCD码修正指令) DA A ; • 若[(A3~0)>9]或[(AC)=1] 则(A3~0)←(A3~0)+06H; 若[(A7~4)>9]或[(Cy)=1] 则(A7~4)←(A7~4)+60H 注: • 本指令不能单独使用,只能用在加法指令之后 • 本指令不能直接用于十进制数减法的调正 • 本指令不能简单的把累加器A中的16进制数变换成 BCD码

算数运算指令

算数运算指令

算数运算指令展开全文算数运算指令算术运算指令的主要功能是实现算术加、减、乘、除等运算。

1.ADD类指令是不带进位的加法运算指令(4条)。

ADD A,Rn ;A+Rn→A, A与Rn寄存器内容相加,结果送到A中ADD A,direct ;(direct)+A→A, A与直接地址内容相加,和送AADD A, @Ri ;(Ri)+A→A, A与Ri间址内容相加,和送AADD A, #data ;data+A→A, A与立即数相加,和送A注意:ADD类指令相加结果均在A中,相加后源操作数不变。

若A中最高位有进位,Cy置1;若半加位有进位,AC置1。

A的结果还影响奇偶标志位P。

例 A=30H, R0=10H执行 ADD A,R0 结果:A=40H, R0=10H,标志位 P=1, Cy=0, OV=0, AC=02.ADDC类指令(带进位加法4条)ADDC A, Rn ;A+Rn+Cy→A, A与R n内容、进位状态相加,和送到A中ADDC A, direct ;(direct)+Cy+A→A, A与直接地址中内容、进位状态相加,和送AADDC A, @Ri ;(Ri)+Cy+A→A, A与Ri间址单元中内容、进位状态相加,和送AADDC A, #data ;data+Cy+A→A, A与立即数、进位状态相加,和送A与ADD类指令的区别是,ADDC指令相加时连同进位标志Cy内容一起相加,主要用于多字节加法中的高位字节的相加,而最低位字节相加用ADD指令。

进位位Cy加到字节的最低位。

例写计算1234H+0FE7H的程序,将结果存入内部RAM的41H 和40H单元,40H存低8位,41H存高8位。

程序MOV A, #34H ;被加数低8位数34H送AADD A, #0E7H ;加数低8位数E7H与之相加,A=1BH,Cy=1 MOV 40H, A ;A→40H即34H+E7H结果存入40H中(40H=1BH)MOV A, #12H ;被加数高8位数12H送AADDC A, #0FH ;加数高8位0FH和Cy与A相加,A=22H MOV 41H, A ;高8位与进位位之和存入41H中(41H)=22H ;总和为221BH,总结果在41H,40H单元中3.SUBB类指令(4条)SUBB类指令是带借位减法指令,其功能是将A中被减数减去源操作数指出的内容,再减去借位标志Cy(原进位标志)状态,差值在A中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.3.2 算术运算指令
涉及两种类型数据: 无符号数和有符号数
。对加减法指令,无符号和有符号数可采用同 一套指令,但应注意:
参加的操作数必须都是无符号数或都是有 符号数。
需使用不同的标志位(CF,OF)来检查无符 号数和有符号数的运算结果是否溢出。
这类指令一般都影响标志寄存器FLAGS 。
2021/3/7
2021/3/7
10
程序段如下:
MOV CX,4 ;置循环次数
MOV SI,0 ;置SI初值为零
CLC
;清进位标志CF
LL: MOV AL,BUFFER2[SI]
ADC BUFFER1[SI],AL ;带进位加
INC SI
;(SI)+1
DEC CX
;(CX)-1
JNZ LL
;若(CX)0,则转LL
BUFFER2开始的两个存储区内,结果放回 BUFFER1存储区,如下页图所示。
因CPU只能进行8位或16位的加法运算, 为此可将加法分4次进行。
2021/3/7
9
BUFFER1
ACH F8H 56H 2CH
BUFFER2
BEH 47H 9EH 30H
被 加 数
数 据 段
加 数
...
多字节加法示意图
OF位表示带符号数相加的溢出。
2021/3/7
12
3) 加1指令INC(单操作数指令)
格式:INC reg/mem 功能:类似于C语言中的++操作:对指定的操作
数加1 例: INC AL
INC SI INC BYTE PTR[BX+4]
注意:本指令不影响CF标志,但对 AF/OF/PF/SF/ZF会产生影响。
例如: ADC AL,68H ;AL←(AL)+68H+(CF) ADC AX,CX ;AX←(AX)+(CX)+(CF) ADC BX,[DI] ;BX←(BX)+[DI+1][DI]+(CF)
2021/3/7
8
ADC指令主要用于多字节加法运算中
例:有两个4字节的无符号数相加: 2C 56 F8 AC + 30 9E 47 BE = ? 设被加数、加数分别存放在BUFFER1及
注:1.源和目的操作数不能同时为存储器操作数 2.不能把段寄存器作为操作数
例:ADD AL,30H ADD AX,[BX+20H] ADD CX,SI ADD [DI],200H
202A1/3D/7D指令对标志位(指6个状态标志)都有影响。7
(2) 带进位位的加法指令ADC
ADC指令在形式上和功能上都有与ADD类似, 只是相加时还要包括进位标志CF的内容。
CF=0
OF=1
(补码表示)
2021/3/7
4
④ 无符号数和有符号数均溢出
无符号数 有符号数
1000 1000
136
-120
+1111 0111 +247 +(-9)
10111 1111
383
-129
结果127
CF=1 OF=1
上面四种情况说明, CF标志可用来表示无符号数的溢出,
OF标志可用来表示有符号数的溢出。
(3) 减1指令DEC
作用类似于C语言中的”--”操作符。
格式:DEC opr 操作:opr←(opr)-1
指令例子: DEC CL DEC BYTE PTR[DI+2] DEC SI
注:该指令与INC一样,它不影响CF标志,但对
AF202/1O/3/7F/PF/SF/ZF会产生影响。
17
0;
当有符号数运算产生溢出时,OF=1(即OF=CF⊕CF1) ,
否则为0;
当运算结果为0时,ZF=1 ,否则为0;
当运算结果为负数时,SF=1 ,否则为0;
当运算一半位置有进位或借位时,AF=1 ,否则为0;
2021/3/7
6
1.加法指令
共有5条: (1) 不带进位的加法指令ADD
格式: ADD acc,data ADD mem/reg,data ADD mem/reg1,mem/reg2
MOV AX, X
MOV DX, X+2
ADD AX, Y
ADC DX, Y+2 ; x+y
ADD AX, 24 ADC DX, 0
; x+y+24
SUB AX, Z SBB DX, Z+2
; x+y+24-z
MOV W, AX 2021/3/7 MOV W+2, DX ; 结果存入W, W+2单元 16
14
(2) 考虑借位的减法指令SBB
SBB指令主要用于多字节的减法。 格式: SBB dest, src 操作: dest←(dest)-(src)-(CF)
指令例子: SBB AX,CX SBB WORD PTR[SI],2080H SBB [SI],DX
2021/3/7
15
例 : x 、 y 、 z 均 为 32 位 数 , 分 别 存 放 在 地 址 为 X, X+2;Y,Y+2;Z,Z+2的存储单元中,用指令序列 实现wx+y+24-z,结果放在W, W+2单元中。
思考:若最高位有进位,如何改?
2021/3/7
11
ADD/ADC指令对条件标志位(CF/OF/ZF/SF)的影响:
SF=
1 结果为负 0 否则
ZF=
1 结果为0 0 否则
CF=
1 0
和的最高有效位有向高位的进位 否则
OF= 1 两个操作数符号相同,而结果符号与之相反
0 否则
CF位表示无符号数相加的溢出。
2021/3/7
13
2. 减法指令
(1) 不考虑借位的减法指令SUB
格式: SUB dest, src
操作: dest←(dest)-(src)
注:1.源和目的操作数不能同时为存储器操作数 2.不能把段寄存器作为操作数
指令例子:
SUB AL,60H
SUB [BX+20H],DX
SUB AX,CX
2021/3/7
有符号数的溢出是一种出错状态,在运 算过程中应当避免。
2021/3/7
5
• 所有的算术运算指令,都会影响FLAGS标志寄存器的6 个状态标志CF/OF/ZF/SF/AF/PF(3个控制标志IF/DF/TF 不受影响)。
• 总的讲,有这样一些规则:
当无符号数运算产生溢出(即最高位向前有进位
或借位)时,CF=1,否则为
1
② 无符号数溢出
无符号数 有符号数
0000 1000 +1111 1101 10000 0101
结果5
8 +253
261 CF=1
+8 +(-3)
+5 OF=0
③ 有符号数;0111 1101 +125 +(+125)
1000 0101 133
+133
结果-123
相关文档
最新文档