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

目录

一、加法指令

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

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

(三)加 1 指令(INC)

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

二、减法指令

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

(二)减 1 指令(DEC)

三、乘法指令

四、除法指令


        单片机中寻址是为了找到操作数,而各类指令则是为了对操作数进行操作。本篇文章将介绍51单片机中的第二类指令——算术运算类指令。

        51 单片机的算术运算类指令是汇编语言编程里极为重要的一类指令,其主要功能是用于进行数据的算术运算,包括加法、减法、乘法、除法等运算操作。以下是对这些指令的详细介绍。

一、加法指令

        在 51 单片机的汇编语言里,算术运算类指令中的加法指令主要包含不带进位加法指令带进位加法指令加 1 指令以及十进制调整指令。

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

        指令格式:ADD A, <源操作数>

        这类指令是把累加器 A 的内容与源操作数相加,结果存于累加器 A 中。忽略进位:A = A + 源操作数。以下是源操作数寻址方式及示例:

1、寄存器寻址

MOV A, #20H    ; 将立即数20H送入累加器A
MOV R0, #30H   ; 将立即数30H送入寄存器R0
ADD A, R0      ; A = A + R0,结果A = 50H

2、直接寻址

MOV A, #20H    ; 将立即数20H送入累加器A
MOV 30H, #30H  ; 将立即数30H送入直接地址30H单元
ADD A, 30H     ; A = A + (30H),结果A = 50H

3、寄存器间接寻址

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、立即寻址

MOV A, #20H    ; 将立即数20H送入累加器A
ADD A, #30H    ; A = A + 30H,结果A = 50H

5、解释不带进位

        “不带进位” 指的是在执行加法运算时,不考虑进位标志(CY)的值

        进位标志 CY 主要用于记录加法运算中是否产生了进位情况,在不带进位加法指令中,它不会影响当前的加法操作。

        例如,当你使用 ADD 指令做两个数相加时,不会把之前运算遗留下的进位值加进来

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

        其源操作数的寻址方式与不带进位的加法指令相同,就不多作阐述。在此以一个产生进位的情况,展示其与不带进位加法指令的不同。

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

MOV A, #20H    ; 将立即数20H送入累加器A
INC A          ; A = A + 1,结果A = 21H

2、寄存器加 1

MOV R0, #20H   ; 将立即数20H送入寄存器R0
INC R0         ; R0 = R0 + 1,结果R0 = 21H

3、直接地址单元加 1

MOV 30H, #20H  ; 将立即数20H送入直接地址30H单元
INC 30H        ; (30H) = (30H) + 1,结果(30H) = 21H

4、寄存器间接寻址单元加 1

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、示例代码

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、寄存器寻址

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、直接寻址

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、寄存器间接寻址

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、立即寻址

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

MOV A, #20H    ; 将立即数 20H 送入累加器 A
DEC A          ; A = A - 1,结果 A = 1FH

2、寄存器减 1

MOV R0, #20H   ; 将立即数 20H 送入寄存器 R0
DEC R0         ; R0 = R0 - 1,结果 R0 = 1FH

3、直接地址单元减 1

MOV 30H, #20H  ; 将立即数 20H 送入直接地址 30H 单元
DEC 30H        ; (30H) = (30H) - 1,结果(30H) = 1FH

4、寄存器间接寻址单元减 1

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、示例代码

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、示例代码

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 的情况出现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/76446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【FPGA】状态机思想回顾流水灯

【FPGA】状态机思想回顾流水灯 一、LED流水灯实现1. 基本要求2. 状态机思想3. 关键代码4. 仿真测试5. 效果演示 二、CPLD和FPGA1. 技术区别2. 应用场景 三、HDLbits组合逻辑题目四、实验总结 一、LED流水灯实现 1. 基本要求 用状态机思想写一个 LED流水灯的FPGA代码写出仿真测…

Python网络爬虫:从入门到实践

目录 什么是网络爬虫&#xff1f; 网络爬虫的工作原理 常用Python爬虫库 编写爬虫的步骤 实战示例 注意事项与道德规范 未来趋势 1. 什么是网络爬虫&#xff1f; 网络爬虫&#xff08;Web Crawler&#xff09;是一种自动化程序&#xff0c;通过模拟人类浏览行为&#x…

3D意识(3D Awareness)浅析

一、简介 3D意识&#xff08;3D Awareness&#xff09;主要是指视觉基础模型&#xff08;visual foundation models&#xff09;对于3D结构的意识或感知能力&#xff0c;即这些模型在处理2D图像时是否能够理解和表示出图像中物体或场景的3D结构&#xff0c;其具体体现在编码场景…

红包-算法

function resPackage(money,num){// 总金额 目前剩余总金额let sum money, currentsum moneylet res [];// 最大值for(let i 0;i<num-1;i){let n parseFloat((Math.random()*currentsum).toFixed(2)) //0-10的随机数if(n<0.1) n 0.1;if(n>sum…

最小二乘求解器lstsq,处理带权重和L2正则的线性回归

目录 代码注释版&#xff1a; 关键功能说明&#xff1a; torch.linalg.cholesky 的原理 代码示例 Cholesky 分解的应用 与 torch.cholesky 的区别 总结 代码注释版&#xff1a; from typing import Optionalimport torchdef lstsq(matrix: torch.Tensor, rhs: torch.Te…

AI辅助下基于ArcGIS Pro的SWAT模型全流程高效建模实践与深度进阶应用

目前&#xff0c;流域水资源和水生态问题逐渐成为制约社会经济和环境可持续发展的重要因素。SWAT模型是一种基于物理机制的分布式流域水文与生态模拟模型&#xff0c;能够对流域的水循环过程、污染物迁移等过程进行精细模拟和量化分析。SWAT模型目前广泛应用于流域水文过程研究…

DHT11数字温湿度传感器驱动开发全解析(下) | 零基础入门STM32第八十八步

主题内容教学目的/扩展视频DHT11芯片电路连接&#xff0c;手册分析。驱动程序&#xff0c;读出数据。能读出温湿度值即可。 师从洋桃电子&#xff0c;杜洋老师 &#x1f4d1;文章目录 一、硬件接口与通信原理1.1 硬件连接拓扑1.2 单总线通信时序 二、驱动代码深度解析&#xff…

24、网络编程基础概念

网络编程基础概念 网络结构模式MAC地址IP地址子网掩码端口网络模型协议网络通信的过程&#xff08;封装与解封装&#xff09; 网络结构模式 C/S结构&#xff0c;由客户机和服务器两部分组成&#xff0c;如QQ、英雄联盟 B/S结构&#xff0c;通过浏览器与服务器进程交互&#xf…

【超详细】讲解Ubuntu上如何配置分区方案

Ubuntu 的分区方案 一、通用分区方案&#xff08;200G为例&#xff09; EFI系统分区&#xff08;仅UEFI启动模式需要&#xff0c;&#xff09; 大小&#xff1a;512MB–1GB类型&#xff1a;主分区&#xff08;FAT32格式&#xff09;挂载点&#xff1a;/boot/efi说明&#xff1…

函数的局部变量和全局变量的区分,Kimi的回答

这段代码的目的是通过计算 2**i 和 5**i 的首位数字&#xff0c;并将这两个首位数字的乘积添加到一个集合中&#xff0c;最终返回这些乘积的总和。下面是具体的解释和问题的分析。 sum_t的角色&#xff1a; sum_t 是一个累加器&#xff0c;用来存储所有独特的&#xff08;不重复…

RNN模型及NLP应用(5/9)——多层RNN、双向RNN、预训练

声明&#xff1a; 本文基于哔站博主【Shusenwang】的视频课程【RNN模型及NLP应用】&#xff0c;结合自身的理解所作&#xff0c;旨在帮助大家了解学习NLP自然语言处理基础知识。配合着视频课程学习效果更佳。 材料来源&#xff1a;【Shusenwang】的视频课程【RNN模型及NLP应用…

【3.软件工程】3.4 原型及相关模型

软件开发模型进化论&#xff1a;从原型驱动到混合模型的完整指南 &#x1f504; 一、模型进化关系全景图 #mermaid-svg-GcOFjt54gUs4oPeu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GcOFjt54gUs4oPeu .error-i…

硬件与软件的边界-从单片机到linux的问答详解

硬件与软件的边界——从单片机到 Linux 设备驱动的问答详解 在嵌入式开发和操作系统领域&#xff0c;经常会有人问&#xff1a; “如果一个设备里没有任何代码&#xff0c;硬件是不是依然会工作&#xff1f;例如&#xff0c;数据收发、寄存器数据存储、甚至中断触发&#xff…

玛卡巴卡的k8s知识点问答题(七)

25. 说明 Job 与 CronJob 的功能 Job 功能&#xff1a; 用于运行一次性任务&#xff08;批处理任务&#xff09;&#xff0c;确保一个或多个 Pod 成功完成任务后退出。 适用于数据处理、备份、测试等场景&#xff0c;任务完成后 Pod 不会自动重启。 特点&#xff1a; 任务…

【NLP 51、一些LLM模型结构上的变化】

目录 一、multi-head 共享 二、attention结构 1.传统的Tranformer结构 2.GPTJ —— 平行放置的Transformer结构 三、归一化层位置的选择 1.Post LN&#xff1a; 2.Pre-LN【目前主流】&#xff1a; 3.Sandwich-LN&#xff1a; 四、归一化函数选择 1.传统的归一化函数 LayerNorm …

VS+Qt配置QtXlsx库实现execl文件导入导出(全教程)

一、配置QtXlsx 1.1 下载解压QtXlsxWriter&#xff08;在github下载即可&#xff09; 网址&#xff1a;https://github.com/dbzhang800/QtXlsxWriter 1.2 使用qt运行 点击qtxlsx.pro运行QtXlsxWriter 选择DesktopQt51211MSVC201564bit编译器&#xff08;选择自己本地电脑qt…

Golang的文件处理优化策略

Golang的文件处理优化策略 一、Golang的文件处理优化策略概述 是一门效率高、易于编程的编程语言&#xff0c;它的文件处理能力也非常强大。 在实际开发中&#xff0c;需要注意一些优化策略&#xff0c;以提高文件处理的效率和性能。 本文将介绍Golang中的文件处理优化策略&…

自学-C语言-基础-数组、函数、指针、结构体和共同体、文件

这里写自定义目录标题 代码环境&#xff1a;&#xff1f;问题思考&#xff1a;一、数组二、函数三、指针四、结构体和共同体五、文件问题答案&#xff1a; 代码环境&#xff1a; Dev C &#xff1f;问题思考&#xff1a; 把上门的字母与下面相同的字母相连&#xff0c;线不能…

VMware+Ubuntu+VScode+ROS一站式教学+常见问题解决

目录 一.VMware的安装 二.Ubuntu下载 1.前言 2.Ubuntu版本选择 三.VMware中Ubuntu的安装 四.Ubuntu系统基本设置 1.中文更改 2.中文输入法更改 3. 辅助工具 vmware tools 五.VScode的安装ros基本插件 1.安装 2.ros辅助插件下载 六.ROS安装 1.安装ros 2.配置ROS…

PostgreSQL pg_repack 重新组织表并释放表空间

pg_repack pg_repack是 PostgreSQL 的一个扩展&#xff0c;它允许您从表和索引中删除膨胀&#xff0c;并可选择恢复聚集索引的物理顺序。与CLUSTER和VACUUM FULL不同&#xff0c;它可以在线工作&#xff0c;在处理过程中无需对已处理的表保持独占锁定。pg_repack 启动效率高&a…