目录
[(三)加 1 指令(INC)](#(三)加 1 指令(INC))
[(二)减 1 指令(DEC)](#(二)减 1 指令(DEC))
单片中寻址是为了找到操作数,而各类指令则是为了对操作数进行操作。本篇文章将介绍51单片机中的第二类指令 ------ 算术运算类指令。
51 单片机的算术运算类指令是汇编语言编程里极为重要的一类指令,其主要功能是用于进行数据的算术运算,包括加法、减法、乘法、除法等运算操作。以下是对这些指令的详细介绍。
一、加法指令
在 51 单片机的汇编语言里,算术运算类指令中的加法指令主要包含不带进位加法指令、带进位加法指令、加 1 指令以及十进制调整指令。
(一)不带进位加法指令(ADD)
指令格式:****ADD A, <源操作数>。
这类指令是把累加器 A 的内容与源操作数相加,结果存于累加器 A中。忽略进位:A = A + 源操作数。以下是源操作数寻址方式及示例:
1、寄存器寻址
XML
MOV A, #20H ; 将立即数20H送入累加器A
MOV R0, #30H ; 将立即数30H送入寄存器R0
ADD A, R0 ; A = A + R0,结果A = 50H
2、直接寻址
XML
MOV A, #20H ; 将立即数20H送入累加器A
MOV 30H, #30H ; 将立即数30H送入直接地址30H单元
ADD A, 30H ; A = A + (30H),结果A = 50H
3、寄存器间接寻址
XML
MOV A, #20H ; 将立即数20H送入累加器A
MOV R0, #30H ; 将立即数30H送入寄存器R0
MOV @R0, #30H ; 将立即数30H送入以R0内容为地址的单元(即30H单元)
ADD A, @R0 ; A = A + (@R0),结果A = 50H
4、立即寻址
XML
MOV A, #20H ; 将立即数20H送入累加器A
ADD A, #30H ; A = A + 30H,结果A = 50H
5、解释不带进位
"不带进位" 指的是在执行加法运算时,不考虑进位标志(CY)的值。
进位标志 CY 主要用于记录加法运算中是否产生了进位情况,在不带进位加法指令中,它不会影响当前的加法操作。
例如,当你使用 ADD 指令做两个数相加时,不会把之前运算遗留下的进位值加进来。
XML
MOV A, #0FFH ; 将立即数0FFH(十进制255)送入累加器A
ADD A, #01H ; 执行A = A + 1,即255 + 1
执行ADD A, #01H时,0FFH(二进制1111 1111)加上01H(二进制0000 0001),相加结果为1 0000 0000。
由于累加器A是 8 位寄存器,只能存储低 8 位结果,所以A中的值变为00H。而最高位产生的进位(即第 9 位的1)会被记录到进位标志CY中,此时CY会被置为1。
(二)带进位加法指令(ADDC)
指令格式:****ADDC A, <源操作数>。
该指令将累加器 A 的内容、源操作数以及进位标志 CY 的值相加,结果存于累加器 A 中。不忽略进位:A = A + 源操作数 + CY。
其源操作数的寻址方式与不带进位的加法指令相同,就不多作阐述。在此以一个产生进位的情况,展示其与不带进位加法指令的不同。
XML
MOV A, #0FFH ; 将立即数 0FFH(十进制 255)送入累加器 A
SETB CY ; 设置进位标志 CY 为 1
ADDC A, #01H ; 执行 A = A + 1 + CY,即 255 + 1 + 1
在此我们需要先设置进位标志,因为是相加之后才产生了CY值的变化,如果一开始值就CY就为0,那么相加时CY就是0,要相加之后,CY才会变为1。
(三)加 1 指令(INC)
指令格式:**INC <操作数> 。这类指令把指定的操作数加 1,操作数可以是累加器**、寄存器、直接地址或寄存器间接寻址的单元。
1、累加器 A 加 1
XML
MOV A, #20H ; 将立即数20H送入累加器A
INC A ; A = A + 1,结果A = 21H
2、寄存器加 1
XML
MOV R0, #20H ; 将立即数20H送入寄存器R0
INC R0 ; R0 = R0 + 1,结果R0 = 21H
3、直接地址单元加 1
XML
MOV 30H, #20H ; 将立即数20H送入直接地址30H单元
INC 30H ; (30H) = (30H) + 1,结果(30H) = 21H
4、寄存器间接寻址单元加 1
XML
MOV R0, #30H ; 将立即数30H送入寄存器R0
MOV @R0, #20H ; 将立即数20H送入以R0内容为地址的单元(即30H单元)
INC @R0 ; (@R0) = (@R0) + 1,结果(30H) = 21H
(四)十进制调整指令(DA)
1、指令作用
在进行 BCD 码加法运算时,由于计算机是按照二进制规则进行加法运算的,可能会出现结果不符合 BCD 码规则的情况。
DA 指令可以根据累加器 A 的运算结果以及进位标志 CY、辅助进位标志 AC 的状态,对累加器 A 中的内容进行调整,从而得到正确的 BCD 码结果。
2、使用场景
DA 指令通常在使用 ADD 或 ADDC 指令完成 BCD 码加法运算后使用。
例如,在处理与十进制数相关的显示、计算等场景中,如电子时钟的时间显示、财务数据的计算等,会采用 BCD 码来表示十进制数,这时就要使用 DA 指令来保证加法运算结果的正确性。
3、DA 指令的调整规则
若累加器A的低4位大于9 或者辅助进位标志AC为1 ,则累加器A的低4位加6进行调整。
若累加器A的高4位大于9 或者进位标志CY 为1 ,则累加器A的高4位加6进行调整。
4、示例代码
XML
MOV A, #28H ; 将 BCD 码 28 送入累加器 A
MOV R0, #39H ; 将 BCD 码 39 送入寄存器 R0
ADD A, R0 ; 执行 BCD 码加法,A = A + R0,即 28 + 39
DA A ; 对加法结果进行十进制调整
5、代码分析
**(1)MOV A, #28H:**把 BCD 码 28 存入累加器 A。
**(2)MOV R0, #39H:**将 BCD 码 39 存入寄存器 R0。
(3)ADD A, R0: 进行二进制加法运算,28H + 39H = 61H,但在 BCD 码运算中,低 4 位 8 + 9 = 17,已经超过了 BCD 码一位所能表示的最大数 9,此时结果是错误的。
(4)DA A: 执行十进制调整指令。因为低4位大于9,所以低4位加6,即 61H + 06H = 67H,同时产生进位,CY 置为 1,最终得到正确的 BCD 码结果 67,进位 CY 表示十位上的进位 1。
**注意:**DA 指令只能用于 ADD 或 ADDC 指令之后,对减法运算的结果不能进行调整。
二、减法指令
在 51 单片机的汇编语言里,算术运算类指令中的减法指令主要包含带借位减法指令、减 1 指令。
(一)带借位减法指令(SUBB)
指令格式:****SUBB A, <源操作数>。
该指令用于将累加器 A 的内容减去源操作数以及借位标志 CY 的值,结果存于累加器 A 中。此指令常用于多字节减法运算。运算结果:A = A - 源操作数 - CY。
以下是源操作数寻址方式及示例:
1、寄存器寻址
XML
MOV A, #30H ; 将立即数 30H 送入累加器 A
MOV R0, #20H ; 将立即数 20H 送入寄存器 R0
CLR CY ; 清进位标志 CY,使 CY = 0
SUBB A, R0 ; A = A - R0 - CY,结果 A = 10H
2、直接寻址
XML
MOV A, #30H ; 将立即数 30H 送入累加器 A
MOV 30H, #20H ; 将立即数 20H 送入直接地址 30H 单元
CLR CY ; 清进位标志 CY,使 CY = 0
SUBB A, 30H ; A = A - (30H) - CY,结果 A = 10H
3、寄存器间接寻址
XML
MOV A, #30H ; 将立即数 30H 送入累加器 A
MOV R0, #30H ; 将立即数 30H 送入寄存器 R0
MOV @R0, #20H ; 将立即数 20H 送入以 R0 内容为地址的单元(即 30H 单元)
CLR CY ; 清进位标志 CY,使 CY = 0
SUBB A, @R0 ; A = A - (@R0) - CY,结果 A = 10H
4、立即寻址
XML
MOV A, #30H ; 将立即数 30H 送入累加器 A
CLR CY ; 清进位标志 CY,使 CY = 0
SUBB A, #20H ; A = A - 20H - CY,结果 A = 10H
5、对标志位的影响
**(1)进位标志 CY:**若减法运算产生借位,CY 会被置为 1;反之则置为 0。
**(2)辅助进位标志 AC:**当低四位相减产生借位时,AC 会被置为 1;否则置为 0。
**(3)溢出标志 OV:**若运算结果超出了有符号数的表示范围( - 128 到 + 127),OV 会被置为 1;反之则置为 0。
**(4)奇偶标志 P:**累加器 A 中 "1" 的个数为奇数时,P 置为 1;为偶数时,P 置为 0。
(二)减 1 指令(DEC)
指令格式:****DEC <操作数>。
这类指令把指定的操作数减 1,操作数可以是累加器A、寄存器、直接地址或寄存器间接寻址的单元。
1、累加器 A 减 1
XML
MOV A, #20H ; 将立即数 20H 送入累加器 A
DEC A ; A = A - 1,结果 A = 1FH
2、寄存器减 1
XML
MOV R0, #20H ; 将立即数 20H 送入寄存器 R0
DEC R0 ; R0 = R0 - 1,结果 R0 = 1FH
3、直接地址单元减 1
XML
MOV 30H, #20H ; 将立即数 20H 送入直接地址 30H 单元
DEC 30H ; (30H) = (30H) - 1,结果(30H) = 1FH
4、寄存器间接寻址单元减 1
XML
MOV R0, #30H ; 将立即数 30H 送入寄存器 R0
MOV @R0, #20H ; 将立即数 20H 送入以 R0 内容为地址的单元(即 30H 单元)
DEC @R0 ; (@R0) = (@R0) - 1,结果(30H) = 1FH
三、乘法指令
在 51 单片机的汇编语言里,乘法指令只有一条,即 MUL AB。
1、指令功能
该指令用于将累加器 A 和寄存器 B 中的两个 8 位无符号整数相乘 ,得到一个 16 位的乘积结果。其中,乘积的低 8 位存放在累加器 A中,高 8 位存放在寄存器 B中。
2、示例代码
XML
MOV A, #05H ; 将立即数 05H 送入累加器 A
MOV B, #03H ; 将立即数 03H 送入寄存器 B
MUL AB ; 执行乘法运算,A × B = 05H × 03H = 0FH
3、代码分析
**(1)MOV A, #05H:**把立即数 05H 传送到累加器 A 中。
**(2)MOV B, #03H:**将立即数 03H 传送到寄存器 B 中。
**(3)MUL AB:**执行乘法操作,05H乘以03H,结果为 0FH 。由于结果小于 256,所以高 8 位为 00H,存于寄存器 B 中;低 8 位 0FH 存于累加器 A 中。
4、对标志位的影响
**(1)进位标志 CY:**执行 MUL AB 指令后,进位标志 CY 总是被清 0,即 CY = 0。这是因为进位信息已经包含在寄存器 B 中,所以 CY 不再用于表示进位情况。
(2)溢出标志 OV:若乘积结果大于 255 (即 B 中的值不为 0),则溢出标志 OV 被置为 1;若乘积结果小于等于 255(即 B 中的值为 0),则 OV 被清 0。可以通过判断 OV 的值来确定乘积结果是否超出了 8 位的表示范围。
**(3)奇偶标志 P:**累加器 A 中 "1" 的个数为奇数时,P 置为 1;为偶数时,P 置为 0。
5、注意事项
(1)MUL AB 指令只能进行 8 位无符号整数的乘法运算。如果需要进行有符号数乘法或者多字节乘法,需要通过软件编程的方式来实现。
(2) 在使用乘法指令时,要注意结果的存储和处理,特别是当 OV = 1 时,需要考虑如何处理高 8 位的结果。
四、除法指令
在 51 单片机汇编语言里,除法指令仅有一条,即DIV AB。
1、指令功能
此指令用于把累加器 A 中的 8 位无符号整数除以寄存器 B 中的 8 位无符号整数,得到的商存于累加器 A 中,余数存于寄存器 B 中。
2、示例代码
XML
MOV A, #0AH ; 将立即数 0AH(十进制 10)送入累加器 A
MOV B, #03H ; 将立即数 03H(十进制 3)送入寄存器 B
DIV AB ; 执行除法运算,A ÷ B = 0AH ÷ 03H
3、代码分析
**(1)MOV A, #0AH:**把立即数 0AH 传送到累加器 A 中。
**(2)MOV B, #03H:**将立即数 03H 传送到寄存器 B 中。
(3)DIV AB:执行除法操作 ,10 ÷ 3 得到商为 3,余数为 1。所以执行完该指令后,累加器 A 中的值变为 03H,寄存器 B 中的值变为 01H。
4、对标志位的影响
(1)进位标志 CY: 执行 DIV AB 指令后,进位标志 CY 总是被清 0,即 CY = 0。因为在除法运算里,两数相除不可能产生溢出,所以进位标志不用于表示特定的运算结果信息。
(2)溢出标志 OV: 当寄存器B中的值为0时,执行除法操作会产生错误(除数不能为 0),此时溢出标志 OV 会被置为 1;若 B 中的值不为 0,OV 则被清 0。我们可以通过判断 OV 的值来确定除法运算是否合法。
**(3)奇偶标志 P:**累加器 A 中 "1" 的个数为奇数时,P 置为 1;为偶数时,P 置为 0。
5、注意事项
(1)DIV AB 指令只能进行 8 位无符号整数的除法运算。要是需要进行有符号数除法或者多字节除法,就得通过软件编程的方式来实现。
(2) 在使用除法指令之前,要保证寄存器 B 中的值不为 0,否则会使 OV 置 1,导致运算结果错误。你可以在执行除法指令前添加判断逻辑,避免除数为 0 的情况出现。