DA指令通俗理解

最近在学微机的过程中,学到DA指令时对其底层实现感兴趣,但是搜集了网上的资料并没有讲的很清楚易懂的,遂有此文章,来分享一些我对这个指令的理解。

1.DA指令的作用

DA A这条指令书上叫做BCD加法调整指令,说人话就是因为单片机的加法指令是二进制的运算,如当01H+09H时如果我们想要将其当作十进制运算,其应该得到是10H,但是实际上给我们返回的是0AH,因此我们需要对其进行一些调整修正,也因此就有了DA指令,这条指令一般只用在我们想要单片机进行十进制运算的时候,在其他场景下使用没有啥意义,而且容易出错。

2.DA指令的底层运算原理/逻辑

2.1 DA指令使用条件

在讲解DA指令的底层运算逻辑之前,首先我先将其的使用条件总结一下放在下面

1.使用时必须紧跟在ADD/ADDC后面,没有其他的使用场景,DA指令就只是个十进制调整指令,注意这一点。

2.DA A,这是其的唯一用法,只能对累加器A使用,其他的都不行。

3.DA指令使用时,其前面的两个加数都必须是BCD码,即必须是0~9,不能是A~F,不然也不行。

4.减数没有调整指令,只有加数有,因此如果想要进行减数的十进制运算,需要通过加法来实现,后面会举例子。

5.注意,BCD码只是用二进制表示十进制的一种表示形式,与其值没有关系,如十进数67,其BCD码形式就为67H

2.2 DA指令底层修正逻辑

DA指令的修正逻辑其实挺好理解的,因为其只有0~9,没有A~F,因此我们需要在其显示出A~F时,让其转化掉,这也就有了下面的修正方法。

其修正有借助PSW标志位中的CY(进位标志)AC(辅助进位标志)的状态,这也就是为啥DA指令要紧跟在ADD/ADDC的后面的原因

1.若低4位大于9或(AC)=1,则低4位加6

2.若高4位大于9或(CY)=1,则高4位加6

3.若以上两条同时发生,或高4位虽等于9但低4位修正后有进位,则应加66H修正

上面就是其最基本也是全部的运算逻辑,下面几张图片是STC15官方文档里截出来的,有一些上面没有提到的但是可以稍微注意一下的点

DA指令操作的伪代码可以看下面这张图

2.3 关于CYAC的一些说明

CYAC在运算时若有相应的进位,则会置1,否则会清0,这又再次说明了为啥DA指令要在ADD/ADDC后面使用,因为其要结合CYAC来进行转换~~!

3.DA指令的使用举例

  • 十进制加法举例
ORG 0000H
MOV A, #56H
ADD A, #38H
DA A
MOV 22H, A
SJMP $
END
  • 十进制减法举例

实现如下,假设够减:

​ (20H)- (21H) -> (22H)

ORG 0000H
CLR C
MOV A, #9AH ;减数的补数为100-减数
SUBB A, 21H
ADD A, 20H ;被减数与减数的补数相加
DA A
MOV 22H, A
SJMP $
END

DA指令通俗理解的更多相关文章

  1. 通俗理解Android事件分发与消费机制

    深入:Android Touch事件传递机制全面解析(从WMS到View树) 通俗理解Android事件分发与消费机制 说起Android滑动冲突,是个很常见的场景,比如SliddingMenu与Li ...

  2. Effective Java通俗理解(持续更新)

    这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...

  3. Effective Java通俗理解(下)

    Effective Java通俗理解(上) 第31条:用实例域代替序数 枚举类型有一个ordinal方法,它范围该常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用 ...

  4. 关于MySQL中的自联结的通俗理解

    关于MySQL中的自联结的通俗理解 前言:最近在通过SQL必知必会这本书学习MySQL的基本使用,在学习中也或多或少遇到了点问题,我也正好分享给大家,我的这篇博客用到的所有表格的代码都是来自SQL必知 ...

  5. Effective Java通俗理解(上)

    这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...

  6. OSI七层模式简单通俗理解

    OSI七层模式简单通俗理解 这个模型学了好多次,总是记不住.今天又看了一遍,发现用历史推演的角度去看问题会更有逻辑,更好记.本文不一定严谨,可能有错漏,主要是抛砖引玉,帮助记性不好的人.总体来说,OS ...

  7. 通俗理解决策树中的熵&条件熵&信息增益

    参考通俗理解决策树算法中的信息增益 说到决策树就要知道如下概念: 熵:表示一个随机变量的复杂性或者不确定性. 假如双十一我要剁手买一件衣服,但是我一直犹豫着要不要买,我决定买这件事的不确定性(熵)为2 ...

  8. CNN笔记:通俗理解卷积神经网络【转】

    本文转载自:https://blog.csdn.net/v_july_v/article/details/51812459 通俗理解卷积神经网络(cs231n与5月dl班课程笔记) 1 前言 2012 ...

  9. 通俗理解LDA主题模型

    通俗理解LDA主题模型 0 前言 印象中,最開始听说"LDA"这个名词,是缘于rickjin在2013年3月写的一个LDA科普系列,叫LDA数学八卦,我当时一直想看来着,记得还打印 ...

  10. 举个例子去理解vuex(状态管理),通俗理解vuex原理,通过vue例子类比

    通俗理解vuex原理---通过vue例子类比   本文主要通过简单的理解来解释下vuex的基本流程,而这也是vuex难点之一. 首先我们先了解下vuex的作用vuex其实是集中的数据管理仓库,相当于数 ...

随机推荐

  1. Web前端入门第 11 问:HTML 常用标签有多少?全量标签有多少?

    HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 截止发文,MDN 收录的 HTML 全量标签有 126 个,有 18 个标记已弃用. 名词解释:MDN --- ...

  2. [Qt基础内容-04] QCheckBox

    QCheckBox 文章目录 QCheckBox 简介 信号 样式设计 本文主要根据QT官方帮助文档以及日常使用,简单的介绍一下QCheckBox的功能以及使用 简介 QCheckBox是一个按钮,其 ...

  3. Windows编程----内核对象竟然如此简单?

    什么是内核对象 内核对象本质上就是内存中的一块内存 ,这块内存由操作系统进行管理和分配,任何应用程序都无法直接操作这块内存区域.至于内核对象的作用,我们暂且不说,这里只需要直到它是内存中的一块内存. ...

  4. 修改docker的默认存储位置及镜像存储位置

    前言 Docker 默认安装的情况下,会使用 /var/lib/docker/ 目录作为存储目录,用以存放拉取的镜像和创建的容器等. 不过由于此目录一般都位于系统盘,遇到系统盘比较小,而镜像和容器多了 ...

  5. go string转int strconv包

    前言 strconv 主要用于字符串和基本类型的数据类型的转换 s := "aa"+100 //字符串和整形数据不能放在一起 所以需要将 100 整形转为字符串类型 //+号在字符 ...

  6. 如何打造你自己的 AI 软件工程师(像 Devin 那样)

    扩展 DeepSeek 的强化学习蓝图路线到AI的其他方面 Nikhil Anand 图片由GPT-4o生成 "AI 软件工程师"这个概念,其实已经不再遥远了.已经有一些技术在逐步 ...

  7. SSH登录方式及如何防止SSH端口被扫

    ssh登录服务器的方式有三种:密码登录,公钥登录,证书登录.同时,密码登录有被破解的风险,网络上也有很多在扫描ssh端口的主机. 比如: 这里175.178.62.36是一个来自广东的服务器,17次尝 ...

  8. 【SpringCloud】Zookeeper服务注册与发现

    Zookeeper服务注册与发现 Eureka停止更新了,你怎么办 https://github.com/Netflix/eureka/wiki SpringCloud整合Zookeeper替代Eur ...

  9. 【Ubuntu】安装OpenSSH启用远程连接

    [Ubuntu]安装OpenSSH启用远程连接 零.安装软件 使用如下代码安装OpenSSH服务端: sudo apt install openssh-server 壹.启动服务 使用如下代码启动Op ...

  10. 谷歌SRE的7条原则

    谷歌SRE的7条原则 拥抱合理的风险 最大化系统的稳定性不仅毫无意义,而且会适得其反.不切实际的可靠性目标限制了新功能交付给用户的速度,而且用户通常不会注意到极端的可用性(比如99.99999%),因 ...