算数运算指令
算术运算指令

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存储区,如下页图所示。
举例说明80c51系列单片机的算术运算指令

1. 概述在现代科技发展迅猛的今天,单片机作为嵌入式系统的核心,扮演着至关重要的角色。
而在单片机的指令集中,算术运算指令更是其中的重要组成部分。
今天,我们将深入探讨80c51系列单片机的算术运算指令,并通过具体的例子来详细说明其运行原理和应用场景。
2. 算术运算指令的基本概念在80c51系列单片机的指令集中,算术运算指令主要包括加法、减法、乘法和除法等基本运算。
这些指令能够对数据进行直接的操作和计算,为单片机的应用提供了强大的支持。
在接下来的内容中,我们将通过具体的例子来解释这些算术运算指令的具体运行方式。
3. 举例说明80c51系列单片机的算术运算指令3.1 加法指令我们将介绍80c51系列单片机中的加法指令。
这些指令可以使单片机对数据进行简单的加法运算,从而实现数据的累加和运算。
当我们需要对两个数据进行相加并将结果存储在一个特定的寄存器中时,我们可以使用ADD指令来实现。
具体的操作方式可参考下面的示例代码:```assemblyMOV A, #10H ; 将第一个数据10H加载到累加器A中ADD A, #20H ; 将第二个数据20H与累加器A中的数据相加```通过这段示例代码,我们可以清晰地看到,在80c51系列单片机中,使用ADD指令可以实现对累加器中数据的加法运算,为我们的应用提供了便利的操作方式。
3.2 减法指令除了加法指令之外,80c51系列单片机还提供了减法指令,用于实现数据的递减和运算。
当我们需要将一个数据减去另一个数据并将结果存储在一个特定的寄存器中时,我们可以使用SUB指令来实现。
具体的操作方式可参考下面的示例代码:```assemblyMOV A, #30H ; 将第一个数据30H加载到累加器A中SUBB A, #10H ; 将第二个数据10H与累加器A中的数据相减```通过这段示例代码,我们可以清晰地看到,在80c51系列单片机中,使用SUB指令可以实现对累加器中数据的减法运算,为我们的应用提供了更加灵活的操作方式。
算术运算类指令

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.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中。
单片机指令的算术运算与数值处理技巧

单片机指令的算术运算与数值处理技巧单片机(Microcontroller Unit,MCU)作为一种集成了处理器核心、存储器和各种外设接口的微型计算机,通常用于嵌入式系统中。
在单片机的编程过程中,算术运算和数值处理是其中一个重要的方面。
本文将介绍单片机指令的算术运算和数值处理的技巧和方法。
一、算术运算指令在单片机中,常见的算术运算指令包括加法、减法、乘法、除法等。
这些指令的使用需要掌握相应的编程知识和技巧。
1. 加法运算在单片机中执行加法运算可以使用ADD指令。
例如,使用ADD A, B指令可以将A寄存器的值与B寄存器的值相加,并将结果保存在A寄存器中。
同时,还可以使用ADD指令进行带进位的加法,比如使用ADDC A, B指令。
2. 减法运算减法运算可以使用SUB指令进行。
例如,使用SUB A, B指令可以将A寄存器的值减去B寄存器的值,并将结果保存在A寄存器中。
还可以使用SUBB指令进行带借位的减法。
3. 乘法运算单片机中一般没有专门的乘法指令,但可以通过多次执行移位和加法运算来实现乘法运算。
例如,可以使用循环结构和移位指令来实现乘法运算,将被乘数左移一位,然后与乘法因子相加。
重复这个过程直到完成相应的乘法运算。
4. 除法运算除法运算在单片机中也没有专门的指令。
如果需要进行除法运算,可以通过循环结构和移位指令来实现。
例如,可以使用循环结构和移位指令将被除数逐步减去除法因子,直到被除数小于除法因子为止,最后得到商和余数。
二、数值处理技巧除了基本的算术运算指令外,单片机的数值处理还需要掌握一些常用的技巧和方法,以提高程序的效率和准确性。
1. 数据类型选择在进行数值处理时,应根据实际需要选择合适的数据类型。
例如,如果处理的数值范围比较小,可以选择使用无符号整型(unsigned int)来提高存储效率。
而如果需要处理负数,可以选择有符号整型(signed int)。
2. 溢出处理在进行算术运算时,可能会出现溢出的情况。
算术运算指令

其结果仍存在A中。 对PSW中各位的影响:与ADD指令相同。 作用:一般用于多字节数的加法运算,低字节相加
时可能产生进位,可以通过带进位加法指令将低字 节的进位加到高字节上去。高字节求和时必须使用 带进位的加法指令。 例3-17、例3-18
四、带借位的减法指令
SUBB A,#data;A←(A)- data- Cy SUBB A,Rn ;A←(A)-( Rn) - Cy SUBB A,@Ri ;A←(A)-(( Ri)) - Cy SUBB A,direct ; A←(A)-(direct)- Cy 功能:把A中的内容减去源操作数所指出的内容和
五、加1指令
INC A ;A←(A)+1 INC Rn ; Rn ←( Rn )+1 INC @Ri ;( Ri)←(( Ri))+1 INC direct ; direct←( direct)+1 INC DPTR ;DPTR←(DPTR)+1 功能:将源操作数所指定的单元或寄存器中的内容
进位位标志Cy的值,差存入A中。
对PSW中各位的影响:
–若D7位有进位(借位),则Cy=1,否则Cy=0; –若D3位有进位(借位) ,则Ac =1,否则Ac =0; –若D6和D7中有且只有一个有进位(借位) ,则Ov=1,否
则Ov=0; –若结果A中1的个数为奇数,则P=1,否则P=0。
例3-19
加1,其结果仍送回原操作单元中。前四条是8位数 加1指令,最后一条是唯一的16位数加1指令。只有 第一条指令对PSW中的奇偶标志位P产生影响,其 余指令不会对PSW的任何标志位产生影响。 例3-20
六、减1指令
DEC A
算数运算指令

算数运算指令展开全文算数运算指令算术运算指令的主要功能是实现算术加、减、乘、除等运算。
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.加法指令
ADD ⽬的操作数, 源操作数
ADC ⽬的操作数,源操作数
INC ⽬的操作数
ADD不带进位的加法指令,ADC带进位的加法指令,影响CF,INC增量指令,操作数⾃加⼀
2.减法指令
SUB ⽬的操作数,源操作数
SBB ⽬的操作数,源操作数
DEC ⽬的操作数
NEG ⽬的操作数
CMP ⽬的操作数,源操作数
SUB不带借位的减法指令,SBB带借位的减法指令,影响标志位,DEC⾃减⼀,NEG是求补指令,功能是将⽬的操作数的内容取补码,再将结果送回操作数,CMP⽐较指令,功能是⽬的操作数减去源操作数,不送回结果,影响标志位
3.乘法指令
MUL 源操作数
IMUL 源操作数
MUL是⽆符号数相乘,IMUL是有符号数相乘。
功能是AL乘以源操作数,16位乘积存放在AX中,或AX乘以源操作数,32位乘积存放在DX,AX
4.除法指令
DIV 源操作数
IDIV 源操作数
CBW
CWD
DIV是⽆符号除法,IDIV是有符号数除法。
功能是DX和AX表⽰的32位除以源操作数,得到的商放在AX中,16位的余数DX中。
或AX表⽰的16位数除以8位的源操作数,得到8位商放在AL中,8位余数放在AH中,CBW将字节扩展成字的指令,即将AL寄存器中的符号位扩展到AH 中。
CWD指令将AX中的被除数扩展成双字,即把AX中的符号位扩展到DX中
5.BCD码运算的调整指令
DAA AAA DAS AAS AAM AAD
⼆进制数实现⼗进制加减法。
二算术逻辑运算指令

三、逻辑运算指令
⑵移位指令
• 累加器A循环左移指令: • RL A ; • 累加器A连同进位位循环左移指令: • RLC A ; • 累加器A循环右移指令: • RR A ; • 累加器A连同进位位循环右移指令 • RRC A ;
三、逻辑运算指令
• 例3-18:若(A)=10111101B=BDH, Cy=0
• 注:执行结果只影响PSW的奇偶校验位P (以A为操 作数时 )
二、算术运算指令
3.乘、除法指令
• MUL AB ; (A)←[(A)×(B)]7-0
•
(B)←[(A)×(B)]15-8
• 如果积大于255(FFH),则溢出标志OV置1,否则清0。进
位标志位Cy总为0。
二、算术运算指令
• 例3-17:设(A)=50H(80),(B) =0AH(160) 执行指令:MUL AB;
• 执行“ RLC A”的结果为 • (A)=01111010B=7AH,Cy=1 • A的内容扩大2倍
三、逻辑运算指令
2 .双操作数的逻辑运算指令
• ⑴逻辑“与”指令
• ANL A,Rn ;(A) ←(A)∧(Rn) • ANL A,direct ;(A) ←(A)∧(direct) • ANL A,@Ri ;(A) ←(A)∧((Ri)) • ANL A,#data ;(A) ←(A)∧data • ANL direct, A ;(direct)←(direct)∧(A) ANL direct,#data;(direct)←(direct)∧data
• 本指令不能简单的把累加器A中的16进制数变换成 BCD码
二、算术运算指令
• 例3-13:设累加器A内容为压缩BCD码56 (即01010110B),寄存器R3的内容为 压缩BCD码67(即01100111B),Cy内 容为1。执行下列的指令:
单片机指令的算术和逻辑运算

单片机指令的算术和逻辑运算在计算机科学与电子工程领域,单片机指令的算术和逻辑运算是非常重要的内容。
本文将深入探讨单片机指令的算术和逻辑运算,介绍其基本原理、应用场景以及相关的编程技巧。
一、算术运算算术运算主要包括加法、减法、乘法和除法。
在单片机中,这些运算由相应的指令来实现。
以加法为例,单片机通常使用ADD指令来执行此操作。
ADD指令可以将两个操作数相加,并将结果存储在目标寄存器中。
类似地,SUB指令用于减法运算,MUL指令用于乘法运算,DIV指令用于除法运算。
除了基本的算术运算指令,单片机还提供了其他相关的指令,如累加指令(INC)和累减指令(DEC)。
这些指令用于对寄存器或内存中的数值进行自增或自减操作。
通过结合这些指令,开发者可以灵活地进行各种复杂的算术运算。
除了整数运算外,单片机还支持浮点数运算。
浮点数是一种表示实数的方法,包括小数部分和指数部分。
单片机中的浮点数运算通常由相应的指令库来实现。
这些指令库提供了一系列的浮点数运算指令,如浮点数加法指令、浮点数乘法指令等。
通过使用这些指令,单片机可以高效地进行复杂的浮点数计算,满足各种实际应用的需求。
二、逻辑运算逻辑运算主要包括与、或、非、异或等操作。
在单片机中,逻辑运算由相应的指令来实现。
以与运算为例,单片机通常使用AND指令来执行此操作。
AND指令可以将两个操作数的对应位进行与运算,并将结果存储在目标寄存器中。
类似地,OR指令用于或运算,NOT指令用于非运算,XOR指令用于异或运算。
逻辑运算在单片机编程中被广泛应用。
它们可以用于条件判断、位操作、数据处理等多个方面。
例如,在某些应用场景下,我们需要对某个输入信号进行判断,并根据判断结果来执行相应的操作。
这时,我们可以利用逻辑运算指令来进行条件判断,并根据判断结果来选择不同的执行路径。
此外,逻辑运算还可以用于位操作。
位操作主要涉及对数据的位进行开关操作,如位与、位或、位取反等。
通过逻辑运算指令,我们可以实现对数据位的精确控制,提高程序的效率和可靠性。
汇编语言设计-算术运算指令

NEG指令是对指令中的操作数取补,再将结果送回。因 对一个操作数求2的补码,相当于0减去此操作数,所以NEG 指令执行的也是减法操作。
说明:0 – OPRD 又相当于: ①、FFH-OPRD+1 (字节操作)或
②、FFFFH-OPRD+1(字操作)。即将OPRD内容变反加1
例:若(AL)=13H 0000 0000 执行 NEG AL – 0001 0011
0000 0110 + 1111 1100 1← 0000 0010
6 + 252
258>255
+6 + (–4)
+2
CF=1 溢出
OF=0 不溢出
ⅲ、无符号数不溢出,带符号数溢出:
二进制加法 认作无符号 认作带符号数
0000 1000 + 0111 1011
1000 0011
8 + 123
131 CF=0 无溢出
2、带进位位的加法指令ADC ADC dest , src ; dest←dest+src+CF
ADC主要用于多字节运算,ADC对标志位的影响同ADD。 例:计算 1234FEDCH+33128765H 分别存于数据段指
定的区域中,低位在前,高位在后,相加后其和存入前一个双 字所在的区域中。 (SI)→1000H DCH (41H)
+ 39H 0011 1001
0110 1110
则(AL)=6EH,低4位为非法码,故需调整。
4、组合十进制加法调整指令DAA
(BCD码的加法十进制调整指令)
格式:DAA
功能:对组合BCD码相加的结果进行调整,使结果仍为 组合的BCD码。
算术与逻辑运算指令

[D]:KnY、KnM、KnS、T、C、D、V,Z
❖ 梯形图
X0
[S1] [S2] [D]
MUL D0 D2 D4
X1
[S1] [S2] [D]
DDIV D10 D12 D14
被乘数 乘数 (D0)×(D2)
积 (D5D4)
被除数
除数
商
余数
(D11D10)÷(D13D12) (D15D14)···(D17D16)
一、二进制加减运算指令
❖ 说明 ➢ 该指令可以进行连续/脉冲执行方式。
注意连续与脉冲方式的区别: 连续方式:则每个扫描周期都加/减1; 脉冲方式:当X1=ON时,只加/减一次1.
二、二进制乘除运算指令
乘法 FNC22 MUL
减法 FNC23 DIV
❖ 操作数
[S1]、[S2]:K、H、KnX、KnY、KnM、KnS、T、C、D、 V,Z
FNC29 NEG
算术与逻辑运算指令
一、二进制加减运算指令
加法 FNC20 ADD
减法 FNC21 SUB
❖ 操作数
[S1]、[S2]:K、H、KnX、KnY、KnM、KnS、T、C、D、 V,Z
[D]:KnY、KnM、KnS、T、C、D、V,Z
❖ 梯形图
X0
X1
[S1] [S2] [D]
ADD D0 D2 D4
(D10) ∨ (D12) →(D14)
(D14) →(D14)
四、逻辑运算指令
❖ 说明 ➢ 各数据的对应位进行二进制与、或、异或运算。 ➢ 32位数据运算时,助记符为DAND、DOR、DXOR。 ➢ 指令运算规则如下:
逻辑与 1 ∧1= 1 1 ∧0= 0 0 ∧1= 0 0 ∧0= 0
算术运算类指令

√ √ √ √ 累加器A中的内容与工作寄存 器Ri所指向地址单元中的内容 相加,结果存在A中
各标志位的形成方法: 如果位7有进位输出,则置位CY,否则清CY; 如果位3有进位输出,则置位AC,否则清AC; OV=CY7⊕CY6。 若累加器A中1的个数为奇数,则P=1,否则,P=0。
√ √ √ √ 累加器A中的内容减工作寄存器中 的内容再减借位位,结果存在A中
A←(A)-((Ri))-(CY)
√√
√ √ 累加器A中的内容减工作寄存器Ri 指向的地址单元中的内容再减借位 位,结果存在A中
在减法运算中
CY=1表示有借位,CY=0则无借位。 OV=1表明带符号数相减时,从一个正数减去一个负数结果为
√√
√
√
累加器A中的内容与立即数连同进位
位相加,结果存在A中
√√
√
√
累加器A中的内容与工作寄存器Rn中
的内容、连同进位位相加,结果存在
A中
√√
√
√
累加器A中的内容与工作寄存器Ri指
向的地址单元中的内容、连同进位位
相加,结果Байду номын сангаас在A中
3. 带借位减法指令(4条)
指令
功能
标志位
解释
PO A C VCY
SUBB A,direct
注意: DA A 只能用于加法运算
【例】:有两个BCD数36与45相加,结果应为BCD码81, 程序如下:
MOV A,#36H
ADD A,#45H
DA A
加法指令执行后得结果7BH;第三条指令对累加器A中的 结构进行十进制调整,低4位(为0BH)大于9,因此要加6, 最后得到调整的BCD码为81。
算术运算类指令

dec byte ptr [si] ;[si]←[si]-1
第2章:2.5 位操作类指令 (逻辑运算指令)
位操作类指令以二进制位为基本单位进行数据的 操作 当需要对字节或字数据中的各个二进制位操作时, 可以考虑采用位操作类指令 注意这些指令对标志位的影响
1. 逻辑运算指令 AND OR XOR NOT TEST 2. 移位指令 SHL SHR SAR 3. 循环移位指令 ROL ROR RCL RCR
;最高位不变,最低位进入CF
第2章:2.5.3 循环移位指令
循环移位指令类似移位指令,但要将从一 端移出的位返回到另一端形成循环。分为:
ROL reg/mem,1/CL ;不带进位循环左移 演示 ROR reg/mem,1/CL ;不带进位循环右移 演示 RCL reg/mem,1/CL ;带进位循环左移 演示 RCR reg/mem,1/CL ;带进位循环右移 演示
AND指令可用于复位某些位(同0相与),不影响其他位
OR指令可用于置位某些位(同1相或),不影响其他位
第2章:2.5.2 移位指令
将操作数移动一位或多位,分成逻辑移位 和算术移位,分别具有左移或右移操作
移位指令的第一个操作数是指定的被移位 的操作数,可以是寄存器或存储单元;后 一个操作数表示移位位数:
只要相“或”的两位 有一位是1,结果就是1; 否则,结果为0
第2章:逻辑异或指令XOR
对两个操作数执行逻辑异或运算,结果送目的操作数
XOR dest,src
;dest←dest⊕src
只有相“异或”的两 位不相同,结果才是1; 否则,结果为0
第2章:逻辑非指令NOT
对一个操作数执行逻辑非运算
NOT reg/mem
汇编语言设计-算术运算指令

N
传完否?
JNZ AGAIN ;CX≠0,循环
Y
结束
8086算术运算指令可用的BCD码有两种:
ⅰ、组合BCD码:一个字节表示2位BCD码
ⅱ、非组合BCD码:一个字节只用低4位表示1位BCD 码, 高4位为0(无意义)。
例:设(AL)=35,(BL)=39 35H 0011 0101
执行 ADD AL,BL
JNS NEXT
;若SF=0,则(AX)>(BX),转NEXT
XCHG AX,BX ;否则交换
NEXT:HLT
Ⅱ、两负数比较,即A<0,B<0:两负数相减,结果也不会溢出,
仍可用符号标志,若SF=0,则A>B;反之若SF=1,则A<B。
Ⅲ、两异号数比较。当A>0,B<0时,当然的结果应该是A>B,
而且有SF=0。
格式:ADD dest,src ;dest←dest+src
功能:将源操作数与目的操作数相加,将结果送回目的操 作数。指令执行后对各状态标志均产生影响。
例:ADD CX,0F0F0H 设指令执行前(CX)=5463H
0101 0100 0110 0011
思考:
+ 1111 0000 1111 0000
LEA SI,BUF1 ;SI指向BUF1 LEA DI,BUF2 ;DI指向BUF2
取数 传送
MOV CX,100 ;CX放计数初值
AGAIN:MOV AL,[SI] ;取一字节数 MOV [DI],AL ;传送一字节数
修改地址指针 修改计数器
INC SI INC DI DEC CX
;修改地址指针 ;修改计数初值
NEG指令是对指令中的操作数取补,再将结果送回。因 对一个操作数求2的补码,相当于0减去此操作数,所以NEG 指令执行的也是减法操作。
算术运算指令

算术运算指令摘要:本文介绍了算术运算指令,首先对其功能和特点进行了概述;接着介绍了具体的指令和它们的功能;随后介绍了如何使用它们;最后总结了它们的有点和缺点。
关键词:算术运算;指令;功能;使用1. Introduction算术运算指令是一类用于快速执行算术运算操作的指令。
它们可以快速而准确地从计算机存储器中取出数据,并在执行算术运算时将数据与指令指示结合起来。
依据实际应用,算术运算指令可分为加法、减法、乘法、除法、移位、取模、取反、转换等指令。
它们的优点在于快速运算,精确度高,节省存储空间,指令少,可混合使用,易于编程。
2. Specific Instructions(1)加法运算指令:加法运算指令是一种最常用的算术运算指令,用于完成两个操作数的加法运算,其形式为“add a,b”,即a+b,其中,a是被加数,b是加数,运算后的结果存放在a中。
(2)减法运算指令:减法运算指令用于实现两个操作数的减法计算,其形式为“sub a,b”,即a-b,其中,a是被减数,b是减数,计算结果存放在a中。
(3)乘法运算指令:乘法运算指令用于实现两个操作数的乘法计算,其形式为“mul a,b”,即a×b,其中,a是被乘数,b是乘数,计算结果存放在a中。
(4)除法运算指令:除法运算指令用于实现两个操作数的除法计算,其形式为“div a,b”,即a÷b,其中,a是被除数,b是除数,计算结果存放在a中。
(5)移位运算指令:移位运算指令用于将一个操作数中的二进制位进行左移或右移操作,其形式为“shl a,b”或“shr a,b”,即将a向左移或向右移b位,可以用来快速乘以或除以2的N次方,计算结果存放在a中。
(6)取模运算指令:取模运算指令用于实现两个操作数的取模计算,其形式为“mod a,b”,即取a对b的余数,计算结果存放在a中。
(7)取反运算指令:取反运算指令用于实现一个操作数的取反计算,其形式为“neg a”,即将a按照求补原理取反,计算结果存放在a中。
算术运算指令

一、算术运算指令算术运算中的溢出问题以8位二进制数的加法为例,两个8位数相加时有4种情况:二进制运算对应的十进制运算数据作为无符号数数据作为有符号数Case1:无符号数和有符号数均不溢出0000 1000+ 0001 11100010 0110结果: 26H(38)CF=0, OF=08+ 3038未超出8位无符号二进制数表示范围+8+ (+30)+38未超出8位有符号二进制数表示范围Case2:无符号数溢出,有符号数不溢出0000 1000+ 1111 11011 0000 0101结果:5CF=1, OF=08+ 253261超出8位无符号二进制数表示范围+8+(-3)+5未超出8位有符号二进制数表示范围Case3:无符号数不溢出,有符号数溢出0000 1000+ 0111 11011000 0101结果:-123(补码)CF=0, OF=18+ 125133未超出8位无符号二进制数表示范围+8+ (+125)+133超出8位有符号二进制数表示范围Case4:无符号数和有符号数均溢出1000 1000+ 1111 01111 0111 1111结果:127CF=1, OF=1136+ 247383超出8位无符号二进制数表示范围-120+ (-9)-129超出8位有符号二进制数表示范围上面四种情况说明,算术运算溢出的判别是比较复杂的,不能只用一个标志位来判别。
算术运算溢出是一种出错状态,在运算过程中应当避免。
1 加法运算指令【例1】ADD CL,20H ;CL←(CL)+ 20HADD AX,SI ;AX←(AX)+(SI)ADD [BX+2],AL ;(BX+2)←((BX)+2)+(AL)ADD DX,[BX+SI] ;DX←(DX)+((BX)+(SI))ADD AX,CL ;错误!操作数类型应一致ADD [SI],[BX] ;错误!不允许两个操作数都是存储器ADD DS,AX ;错误!不允许把段寄存器作为操作数加法指令对全部6个状态标志位都会产生影响。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2. 减1指令(4条)
DEC A
;A-1→A,影响P标志
DEC Rn DEC direct DEC @Ri
;Rn-1→Rn ;(direct)-1→(direct) ;(Rn)-1→(Rn) 与加1指令类似。
4. 乘法指令(1条)
MUL AB
;A×B→BA
此指令的功能是将A和B中的两个8位无符号数相乘, 两数相乘结果一般比较大,因此最终结果用1个16位
然后再做10H + 30H + CY,结果是41H,所以 最终的结果是4107H。
设:1067H存在R1R0中, 30A0H存在R3R2中,计算 R1R0+R3R2,结果存在R5R4中。
MOV A,R0 ADD A,R2 MOV R4,A MOV A,R1 ADDC A,R3 MOV R5,A
;R0+R2→A和CY ;R1+R3+CY→A和CY
; (A)+data→(A) ; (A)+(direct )→(A) ; (A)+(Rn)→(A) ; (A)+(Ri)→(A)
用途:将A中的值与源操作数所指内容相加,最终结果 存在A中。
例1:ADD A,#47H ADD A,34H ADD A,R7 ADD A,@R0
例2: MOV A,#0AEH ;-82D
实验
ADD A,#81H ;-127D
验证 则执行完本条指令后,A中的值为2FH;
一下 C=1,AC=0,OV=1,P=1。 本例 对无符号数:结果为12FH;
带符号数运算:OV=1,有错。
(2)带进位位的加法指令(4条)
ADDC A,Rn
; A+Rn+CY→A
ADDC A,direct ; A+(direct )+CY→A
例: 1067H+30A0H
0001 0000 0110 0111 0011 0000 1010 0000 0100 0001 0000 0111
1067H 30A0H
4107H
先做67H+A0H=107H,而107H显然超过了0FFH, 因此最终保存在A中的是07H,而1则到了PSW中的 CY位了。换言之,CY就相当于是100H。
练习
试编写1234H-0FA3H的程序段,将结果高8 位存入51H, 低8位存入50H单元。
CLR C MOV A,#34H SUBB A,#0A3H MOV 50H,A MOV A,#12H SUBB A,#0FH MOV 51H,A
课堂练习
1.设:内部RAM中,(40H)=50H,(41H)=60H, (50H)=30H, (51H)=70H,执行下列片段后:
将A中的值减去源操作数所指内容以及进位位C中的
值,最终结果存在A中。
如: SUBB A,R2
设: (A)=C9H,(R2)=55H,(CY)=1,
执行指令之后,A中的值为73H。
说明:没有不带借位的减法指令,如果需要做 不带借位的减法指令(在做第一次相减时),只要 将CY清零即可。
对带符号数,要注意OV标志。OV=1,出错。
数来表达,其中高8位放在B中,低8位放在A中。 在乘积大于FFH时,0V置1,否则OV为0;而CY总是0。 例: (A)=4EH,(B)=5DH,执行指令MUL AB后, 乘积是1C56H,所以在B中放的是1CH,而A中放的 则是56H。
OV= 1 P= 0
5. 除法指令(1条)
DIV AB
;A÷B的商→A,余数→B
第二讲(3) 算术运算类指令 (24条)
Arithmetic Operations
主要对8位无符号数;也可用于带符号数运算。 包括:加、减、乘、除、加1、减1运算指令
影响PSW有关位。
1. 加法指令(13条) (1)不带进位位的加法指令(4条)
ADD A,#data ADD A,direct ADD A,Rn ADD A,@Ri
ADDC A,@Ri ; A+(Ri)+CY→A
ADDC A,#data ; A+data+CY→A
用途:将A中的值和其后面的值以及进位位C中的值相加,
最终结果存在A,常用于多字节数运算中。
说明:由于51单片机是一种8位机,所以只能做8位的数学 运算,但8位运算的范围只有0~255,这在实际工作中是不 够的,因此就要进行扩展,一般是将2个8位(两字节)的数 学运算合起来,成为一个16位的运算,这样,可以表达的 数的范围就可以达到0~65535。
INC @R0 ;(34H)=23H
INC DPTR ; DPTR=1235H
2. 减法指令(8条)
(1) 带借位的减法指令(4条)
SUBB A,Rn
; A-CY→A
SUBB A,direct ; A-(direct )-CY→A
SUBB A,@Ri
; A-(Ri)-CY→A
SUBB A,#data ; A-data-CY→A
此指令的功能是将A中的8位无符号数除B中的8位 无符号数(A/B)。除了以后,商放在A中,余数放 在B中。 CY和OV都是0。如果在做除法前B中的值是00H,也 就是除数为0,那么0V=1。 如:(A)=11H,(B)=04H,执行指令DIV AB后, 结果(A)=04H,(B)=1。
CY= 0 OV= 0 P= 1
先做67H+20H=87H,没有超过0FFH,因此最终保存在 A中的是87H,而PSW中的CY=0。
然后再做10H + 30H + CY,结果是40H,所以最终的结果 是4087H。
(3) 加1指令(5条)
INC A
;A+1→A
INC Rn
;Rn+1→Rn
INC direct
;(direct)+1→(direct)
(40H)= H (50H) =
H (A)=
H
(41H)= H (51H)=
H (R0)= H
设:1067H存在R1R0中,
又例: 1067H+3020H
3020H存在R3R2中,计算 R1R0+R3R2,结果存在R5R4
中。
实验
0001 0000 0110 0111 1067H
验证 一下
0011 0000 0010 0000 3020H
本例
0100 0000 1000 0111 4087H
a. MOV R0,40H MOV A,@R0 INC R0 MOV @R0,A
;(R0)=50H ;(A)=30H ;(R0)=51H ;(51H)=30H
b. MOV R0,#40H MOV A,@R0 INC @R0 MOV A,@R0
;(R0)=40H ;(A)=50H ;(40H)=51H ;(A)=51H
INC @Ri
;(Rn)+1→(Rn)
INC DPTR
;DPTR+1→DPTR
功能很简单,就是将后面目标中的值加1。
例:A=12H,R0=33H,(21H)=32H, (34H)=22H,DPTR=1234H。
连续执行下面的指令:
INC A ; A=13H
INC R0 ; R0=34H
INC 21H ;(21H)=33H