51单片机的五类指令(二)——算术运算类指令

目录

一、加法指令

(一)不带进位加法指令(ADD)

(二)带进位加法指令(ADDC)

[(三)加 1 指令(INC)](#(三)加 1 指令(INC))

(四)十进制调整指令(DA)

二、减法指令

(一)带借位减法指令(SUBB)

[(二)减 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 中的值不为 0OV 则被清 0。我们可以通过判断 OV 的值来确定除法运算是否合法

**(3)奇偶标志 P:**累加器 A 中 "1" 的个数为奇数时,P 置为 1;为偶数时,P 置为 0。

5、注意事项

(1)DIV AB 指令只能进行 8 位无符号整数的除法运算。要是需要进行有符号数除法或者多字节除法,就得通过软件编程的方式来实现。

(2) 在使用除法指令之前,要保证寄存器 B 中的值不为 0,否则会使 OV 置 1,导致运算结果错误。你可以在执行除法指令前添加判断逻辑,避免除数为 0 的情况出现。

相关推荐
茯苓gao16 小时前
嵌入式开发笔记:CANopen相关移位运算与通信协议术语详解
网络·嵌入式硬件·学习·信息与通信
梁朝辉19 小时前
STM32H750VBT6中ADCINP与INN什么区别
stm32·单片机·嵌入式硬件
省四收割者20 小时前
一文详解信号完整性(1)
python·嵌入式硬件·数学建模·信息与通信·信号处理·智能硬件
崇山峻岭之间21 小时前
单片机无感FOC驱动之ADC
单片机·嵌入式硬件
Ligocious21 小时前
1.点亮一颗小小的LED
单片机·嵌入式硬件
KaifuZeng1 天前
通信与接口协议面试八、CAN通信
单片机·嵌入式硬件·面试·通信与接口协议
智源单片机设计1 天前
基于单片机的直流电机双闭环调速系统设计
单片机·嵌入式硬件
KaifuZeng2 天前
通信与接口协议面试一、基本概念
嵌入式硬件·通信与接口协议
wuyk5552 天前
24. C 语言模块化:不是拆几个.c 文件那么简单
c语言·开发语言·stm32·单片机
☆cwlulu2 天前
调试排查工具介绍(gdb、strace、Valgrind等)
开发语言·c++·嵌入式硬件·ubuntu