BCD和非BCD

非压缩BCD码转压缩BCD码汇编语言 DATAS SEGMENT     ;此处输入数据段代码     buf dw 0302h,0908h,0705h,0102h     res db ?     buf_size db ?     res_size db ?   DATAS ENDS   STACKS SEGMENT     ;此处输入堆栈段代码 STACKS ENDS   CODES SEGMENT   阅读详情

BCD和非BCD的作用


大家都知道在计算机里面都是使用二进制,其实,8086/8088 CPU 也可以使用十进制进行计算的。

在计算机中的十进制数称为 BCD 码,它是使用四位二进制数,表示一位十进制数字。

常见的 BCD 码是 8421 码。即:0000 ~ 1001 分别代表 0 ~ 9。

一个字节有 8 位数,可以代表两位十进制数,即:0000 0000 ~ 1001 1001,分别代表 0 ~ 99。

二进制的写法,太长了,写成 16 进制好看些,即:00H ~ 99H,代表十进制的 0 ~ 99。

用一个字节代表两位十进制数,这称为压缩的 BCD 码。
如果只是使用低四位,一个字节代表就只能代表一位十进制数,这称为非压缩的 BCD 码。

用 BCD 码代表十进制进行数值计算,我们的希望是“逢十进一”。
但是,CPU 是按照二进制计算的,它只会“逢二进一”。
那么,低四位向高低位进位的时候,仅仅是超过 15 的时候才进位,即逢 16 进一。

  1. 如果用 BCD 码相加,希望低四位(或高四位)能够“逢十进一”,那就在它们超过了 9 、应该进位而没有进位的时候,给它再加上 6,它就可以进位了。
  2. 另外,如果已经发生了进位,这个进位 1,就代表进走了 16,比十进制多进走了 6,此时,也应该再加上 6。

BCD码运算结果为何要进行调整?
• 例1:计算38+29=?
采用BCD码进行运算: 00111000+00101001=01100001(61)
但是正确的结果是 67 结果相差6
• 例2:计算25+16=?
采用BCD码计算: 00110101+00010110=00111011
结果的低四位是非法的8421码
• 出错的原因
第一个例子中, D3向D4产生了一个进位,即AF=1(半进位)这个半进位相当于16,而按照十进制正常的进位是10,所以相比于十进制的进位多进了6,故结果比正常的少了6.
调整:当有半进位时,在低位的BCD码上再加6(0110)进行调整。
• 第二个例子:在个位数的运算中不足以引进半进位(5+6=11<16),而按照十进制的运算规
则它应该向高位进位,使得高位的BCD码没有得到进位而出错。
调整:相加结果的低位BCD码大于9时,加上0110(6),迫使其向高位产生进位。
即: 00111011+00000110=01000001=41

这两个步骤,称为十进制调整。经过十进制调整,运算结果就符合十进制的运算规则了。

在 8086/8088 CPU 指令系统中,具有这种调整指令:DAA和AAA

  • 在压缩的 BCD 码相加后,使用DAA指令,它就会把结果调整为符合十进制运算的 BCD 码。 如果是非压缩的 BCD码相加,则应该使用AAA 指令。

其它几种 BCD 码的运算,应该使用的调整指令如下:

  • 压缩的 BCD 码相减后,应使用 DAS 指令;

  • 非压缩的 BCD 码相减后,应该使用 AAS 指令;

  • 非压缩的 BCD 码相乘后,应该使用 AAM 指令;

  • 非压缩的 BCD 码相除后,应该使用 AAD 指令。

注意,没有压缩的 BCD 码相乘、除后的调整指令。

这些 BCD 码的十进制调整指令,都是对 AL 中的运算进行调整。因此,各种 BCD 码的运算,都应放在 AL 中进行。

十进制调整指令的应用例题。


一、非压缩的 BCD 码的加法

;12345+67890=80235 计算并全部显示出来

DATAS SEGMENT
   X  DB  1, 2, 3, 4, 5  ;存放5位十进制数
   Y  DB  6, 7, 8, 9, 0  ;都是非压缩的BCD码
   Z  DB  6  DUP(?)      ;6位数的和
DATAS ENDS

CODES SEGMENT
    ASSUME CS:CODES, DS:DATAS
START:
    MOV  AX, DATAS
    MOV  DS, AX
    MOV  SI, 0
    MOV  CX, 5           ;计划循环5次
    K1: MOV  DL, X[SI]       ;取出一位X
    ADD  DL, 30H         ;变成ASCII码
    MOV  AH, 2           ;显示在屏幕
    INT  21H
    INC  SI              ;指向下一位
    LOOP K1
    MOV  DL, '+'         ;显示加号
    MOV  AH, 2
    INT  21H
    MOV  SI, 0
    MOV  CX, 5
    K2: MOV  DL, Y[SI]
    ADD  DL, 30H
    MOV  AH, 2           ;显示5位数Y
    INT  21H
    INC  SI
    LOOP K2
    MOV  DL, '='         ;显示等号
    MOV  AH, 2
    INT  21H
;5位非压缩的BCD码相加.
    CLC            ;clean carryflag   
    MOV  SI, 4
    MOV  CX, 5           ;循环加5次
    K3: 
    MOV  AL, X[SI]       ;X、Y都是非压缩的BCD码
    ADC  AL, Y[SI]       ;在AL中相加
    AAA                  ;非压缩的BCD码调整
    MOV  Z[SI + 1], AL   ;保存和数
    DEC  SI
    LOOP K3 
;---------------下面第6位BCD码.
    MOV  AL, 0
    ADC  AL, 0
    MOV  Z, AL
;---------------下面是6位和的BCD码显示.
    MOV  SI, 0
    MOV  CX, 6           ;显示6位
K4: MOV  DL, Z[SI]
    ADD  DL, 30H
    MOV  AH, 2
    INT  21H
    INC  SI
    LOOP K4
;---------------下面就结束程序.
    MOV  AH, 4CH
    INT  21H
    CODES ENDS
    END START

从这个程序来看,进行多位数的加减法计算,用 BCD 码是十分方便的,位数的多少,几乎就没有障碍 特别是显示,要比使用二进制来计算后,再用十进制数字的显示,要方便的多

二、压缩的 BCD 码相乘

  • 压缩的 BCD 码相乘,8086/8088 指令系统中并没有相应的十进制调整指令,因此,就不能使用乘法指令了。那么,这个乘法,就只能用“累加”的方法来做
    即:用乘数当做循环次数,循环的把被乘数加起来。每一次循环,加一次被乘数,乘数减一次一,直到减到0。

  • 这里的加、减,都是 BCD 码运算,加减之后,都要用十进制调整。

;压缩BCD码相乘程序

DATA  SEGMENT
 N1  DB  28H     ;28  ,写两个压缩的BCD码
 N2  DB  04H     ; 4  ,当做乘数
 Product  DW  ?  ;乘积,结果应为0112H,即28*4=112
DATA  ENDS

CODE  SEGMENT
   ASSUME CS:CODE, DS:DATA
START:
   MOV  AX, DATA
   MOV  DS, AX
;-----------------------------------------
   MOV  AX, 0   ;积为0
   MOV  CL, N2  ;相加的次数
AGAIN:
   ADD  AL, N1  ;N1加入到积中
   DAA          ;压缩BCD码的加法十进制调整
   XCHG AH, AL  ;交换高8位

   ADC  AL, 0   ;高8位加上进位
   DAA          ;调整
   XCHG AH, AL  ;交换回来
   
   XCHG AL, CL  ;相加的次数
   SUB  AL, 01  ;减一
   DAS          ;压缩BCD码的减法十进制调整
   XCHG AL, CL  ;送回
   JNZ  AGAIN   ;非0转移,继续累加
   
   MOV  Product, AX ;保存乘积

;-----------------------------------------
   MOV  AH, 4CH
   INT  21H
CODE ENDS
   END  START

DAA、DAS,这两条指令,只能用在AL的加减运算的后面。
因此,其它寄存器的运算,都要弄到AL中来进行,算完了,再弄回去。所以,要来回的换。

三、16 进制数变换成 ASCII 码

16 进制数 0 ~ 9、A ~ F 变换成 ASCII 码 30H ~ 39H、41H ~ 46H,需要分别对数字加上 30H 或 37H。
这种变换一般都是使用分支程序、查表程序的方法。

还有一种使用十进制调整的方法,程序非常简单,但是技巧性很强,一般人是难以理解的。

程序片断如下:

MOV  AL,  X    ;取来数字0~9、A~F
ADD  AL,  90H
DAA
ADC  AL,  40H
DAA
MOV  Y,  AL    ;保存ASCII码
19、管理固件、启动配置和启动:BCD 编辑器的全面指南 本文全面介绍了如何使用BCD编辑器(Bcdedit.exe)管理固件、启动配置和启动过程。内容涵盖查看和管理BCD存储条目、创建和删除启动条目、设置启动选项、导入导出配置以及常见问题的解决方案。通过详细的流程图和操作示例,帮助用户更好地理解BCD编辑器的高级功能,并确保系统启动的稳定性和可靠性。 阅读详情

相关推荐

【嵌入式C基础】第2篇:进制转换与BCD编码

1 前言 D 十进制 B 二进制 H 十六进制 什么是权? 权:权指的是数据中每一位的基本单位。 例如十进制中数字123,那个3是各位,权为1,2是十位,权为10,1是百位,权是100. 十进制 10的i次方(i表示第几位) 二进制 2的i次方 其他同理 2 非十进制转十进制 3 十进制转非十进制 3.1 十进制转二进制 整数部分转换为二进制数时采用“除2取余”的方法,即连续除2并取余数作为结果,直至商为0,得到的余数从低位到高位依次排列即得到转换后二进制数的整数部分; 对小数部分,则用“乘2取

黑猫奥利奥的博客 464

计算机中的编码

编码 就是将所有由计算机处理的信息转换成二级制的形式 用代码来表示各种信息,以便于计算机处理 需要编码的种类 数值,字符,声音,图像等这些信息要想被计算机识别,都需要编码 计算机中的编码 数值编码 二级制码 BCD码 用二进制数表示的十进制数 8421BCD编码 用四位二进制码表示一位十进制数,每4位之间有一个空格,因为4位二进制码才有16种组合,而3位只有八种组合,不足以表示全部...

qq_41386300的博客 2529

【理论&实战篇】大模型RAG技术详解(一)-基础篇

RAG的初衷是为了增强大模型的事实性、时效性,减少幻觉,引入专业知识优化生成回复,是一种结合了信息检索技术与语言生成模型的人工智能技术。通过,并将其作为提示(Prompt)输入给大模型(LLM),来。

qq_41375680的博客 377

BCD码

BCD码分为组合BCD码和非组合BCD码(ASCII码)。 组合BCD码是通常的8421码,它用4个二进制位表示一个十进制位,一个字节可以表示两个十进制位,即00~99。 MOV AL,68H   ;AL=68H,表示压缩BCD码68 MOV BL,28H   ;BL=28H;表示压缩BCD码28 ADD AL,BL    ;二进制加法:AL=68H+28H=90H DAA           ...

LOG_IN_ME的博客 7143

时间序列聚类在股票市场分析中的实践与优化

时间序列聚类是一种面向动态行为建模的无监督学习方法,其核心在于通过语义感知的距离度量(如DTW)捕捉价格形态的相位弹性与结构相似性,而非依赖静态数值或标签驱动。相比K-Means等传统算法,它能有效缓解金融时序中普遍存在的噪声敏感、对齐失效与形态失真问题,从而提升聚类结果的市场可解释性与策略鲁棒性。该技术已广泛应用于市场状态识别、行业行为分群、异常交易监测等场景,并成为构建可验证量化分析框架的关键预处理层。本文聚焦A股真实行情数据,详解从原始OHLCV到可聚类时间序列的完整链路,涵盖DTW距离计算、层次聚类

weixin_34220179的博客 832

Keil环境下单片机串口通信实战:如何用printf发送中文(附完整代码)

本文详细解析了在Keil开发环境下,单片机通过串口通信发送中文信息时产生乱码的根本原因及解决方案。核心在于理解并统一编码(如GB2312或UTF-8),并正确重定向printf函数。文章提供了针对STC89C52和STM32F103的完整代码示例,涵盖工程配置、编码设置、调试技巧,帮助开发者实现稳定可靠的中文串口输出。

weixin_29168675的博客 469

BCD编码转换

BCD的实质就是用二进制编码表示十进制数字 压缩BCD:使用4位二进制编码表示一个十进制数 非压缩BCD:使用8位二进制编码表示一个十进制数 对应关系如下: 例:十进制数999转BCD 压缩BCD表示:1001 1001 1001 1001 非压缩BCD表示:00001001 00001001 00001001 00001001 压缩BCD表示: 例:二进制数1011 0111 1110 1101转BCD 1101超出了1001(9),于是加上0110(6),进位给它的高4位1110+0001 结果为10

dc12499574的博客 6532

Windows10下使用Intel SGX功能(一):环境搭建

Windows 10 下测试 Intel SGX功能。

shuizhongmose的专栏 6987

第5讲 计算机中的编码

计算机中的编码

t42t24t2t的博客 1720

别再手动量了!用Python+Open3D给BIM模型做‘CT扫描’,自动揪出施工误差(附完整代码)

本文介绍如何利用Python和Open3D技术实现BIM模型的毫米级施工误差自动检测。通过点云预处理、模型配准和偏差分析,系统能自动生成三维差异热力图和验收报告,显著提升施工质量检测效率。特别适合混凝土结构错位和钢结构安装偏差等常见问题的智能分析。

weixin_29284657的博客 244

从可用性到情感共鸣:构建下一代人机交互的智能伙伴

本文探讨了人机交互从功能满足到情感共鸣的范式转变,分析了情感计算的三大技术支柱——多模态感知网络、上下文感知引擎和情感生成模型,并展示了医疗健康、教育领域和智能家居等垂直场景的落地实践。文章还提出了设计下一代交互系统的五个原则,为构建更智能、更具情感共鸣的人机交互伙伴提供了实用指导。

weixin_29073241的博客 245

汇编学习笔记07——BCD码及调整指令

一、BCD码 什么是BCD码呢? BCD码的全称是Binary Coded Decimal。可以看出是关于二进制和十进制的编码。 我们在写十进制转二进制的时候,采用的是8421编码制,比如十进制的43,在二进制就是 0010 1011 而BCD码会将这个十进制的数分割成4和3,分别用两个4位二进制去表示: 0100 0011——0100是4 0011是3. BCD码其实有两种格式,压缩BCD码和非压缩BCD码 上面写的那种就是压缩BCD码,一个字节的高低四位各表示一个十进制数。 而非压缩BCD码则是,一个

qq_44899247的博客 1万+

4 屏 + 8 摄像头一开,谁在悄悄拖慢你的座舱域控?

如果你觉得座舱卡顿:❌ 别第一反应怪 SoC❌ 别盲目堆算力。

weixin_43199439的博客 152

BCD码和非BCD码的计算与转换

文章目录BCD码和非BCD码的计算与转换BCD编码介绍:优点:常用的BCD编码方式8421码5421码2421码余3码非压缩BCD码 BCD码和非BCD码的计算与转换 BCD编码 介绍: BCD码(Binary-Coded Decimal‎),用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数字编码形式,用二进制编码的十进制代码。 优点: BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行。 这种编码技巧最常用于会计系统的设计里,因

qq_43761222的博客 5824

镜头像差之五——场曲

什么是场曲? 场曲[curvature of field] 物面上所有的点经过系统后,最佳焦点位置不在同一平面上,若这些像点所成的面为曲面,则称为系统有场曲。 与物高二次方、入射光瞳口径一次方成正比的像差。若仅存在场曲,则所有物平面上的点都有相应的像点,但分布在一个球面上;若采用弯成此种形状的底片,则可获得处处清晰的像。此时在理想像平面上,像点呈现为圆斑。 第一张图是最简单也是最容易理解的场曲,也就是对焦点锐利,其余部分逐渐松散,但实际上大多现代镜头的场曲都呈现为图二的形态:对焦点与边缘锐度.

camerall 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

单片机学习笔记————组合BCD码,非组合BCD码,以及数值三者之间的相互转换和关系

proteus虚拟串口的实现:https://mp.youkuaiyun.com/console/editor/html/107251649 一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: BigData ---- @F.

DJDN426611的博客 2770

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

非 BCD 码的乘除及其混合运算

一、 实验目的 a) 熟悉、掌握非 BCD 码乘除的十进制调整指令 b) 掌握非 BCD 码乘除数据在数据段的定义方式 c) 实现非 BCD 码的乘除及其混合运算 二、 实验重难点 a) 重点:在进行非 BCD 码的乘除法时需要用到十进制调整指令, 须了解、掌握该指令的格式及功能。非 BCD 码乘除时,数据 的定义须注意。 AAM 指令 指令格式: AAM ;把 AL 中的积调整为非 BCD 码格式送到 AX 中 2. AAD 指令 指令格式: AAD ;(al)<—10*(ah)+(al),(ah

路在前方 767

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

非 BCD 码的加减及其混合运算

一、 实验目的 a) 熟悉、掌握十进制调整指令(非 BCD 码) b) 熟悉掌握非 BCD 码数据段数据的定义 c)实现非 BCD 码的加减及其混合运算 二、实验重难点 a)重点:进行非 BCD 码加减法运算时,需要利用十进制调整指令, 所以要熟悉其指令格式。 1.AAA 指令 指令格式: AAA ;AAA为无目操作,用以完成对非BCD码加运算校正 用法:(al)<—把 al 中的和调整到非 BCD 码格式 (ah)<—(ah)+调整产生的进位 2.AAS 指令 指令格式: AAS ;AAS为无

路在前方 848

设计检查输入四位二进制数是否为 8421 BCD 码的电路

**BC整体的非((B C)')**:表示的是 B 和 C 不同时成立,即 B 和 C 不能同时为 1 时输出 1,其他情况输出 0。**"B非C非"** 和 **"BC整体的非"** 都是逻辑运算中的表达方式,它们有不同的含义和运算规则。- **B非C非(B' C')**:表示的是 B 和 C 都不成立,即 B 和 C 都为 0 时输出 1,其他情况输出 0。因此,**B非C非** 和 **BC整体的非** 在某些输入情况下会得到不同的结果。这个表达式表示的是“B 和 C 不是同时成立”时的情况。

2301_80330323的博客 1263

115sha1码怎么用_学西门子PLC时,BCD码和十六进制要分清,附寻址介绍表

容易让人糊涂的BCD码和十六进制BCD码(Binary-Coded Decimal‎)是二进制编码的十进制数的缩写,BCD码用4位二进制数表示一位十进制数。BCD码各位的数值范围为2#0000~2#1001,对应于十进制数0~9。BCD码不能使用十六进制的A~F(2#1010~2#1111)这6个数字。BCD码本质上是十进制数,因此相邻两位逢十进一。 BCD码的最高位二进制数是符号位,负数的符号位...

weixin_42669344的博客 5670

【计算机组成原理】你知道什么是8421码、什么是余3码什么又是2421码吗?今天这篇文章带你认识计算机中的BCD码

【计算机组成原理】第二章——数据的表示与运算 详细介绍BCD码中的8421码、余3码以及2421码的相关内容……

蒙奇D索大的博客 3687

数电快速入门(一)(BCD码和三种基本逻辑运算的介绍)

本文适用于暂无学习数电以及需要快速复习数电的读者,希望对你们有所帮助!!!

小林学编程的博客 3866

【学习计算机组成原理】浮点数表示特殊值

文章目录无穷(3)非数(4)零(1)非规格化数(2)用十进制表示数值数据ASCII码BCD码C++调试 对于指数(阶码)和尾数我们有4种特殊情况 指数全0,尾数全0 指数全0,尾数非0 指数全1,尾数全0 指数全1,尾数非0 无穷(3) 正无穷:0 11111111 0000 0000 0000 0000 0000 000 负无穷:1 11111111 0000 0000 0000 0000...

和我一起学习 1683

微机原理--第三章(4)算数运算指令(2)

(3)乘法指令 无符号数的乘法指令MUL MUL SRC ;无符号字节乘法AX←(AL)*(SRC) ;无符号字乘法DX.AX←(AX)*(SRC) 有符号数的乘法指令IMUL IMUL SRC ;有符号字节乘法AX←(AL)*(SRC) ;有符号字乘法DX.AX←(AX)*(SRC) 乘法指令对标志的影响 乘法指令OF和CF标志: MUL指令——若乘积的高一半(AH/DX)为0,

jxm_96的博客 2735

gg代码转xs代码工具_多余3(XS-3)代码和格雷代码

gg代码转xs代码工具 多余的3码 (Excess-3 Code) Excess-3 Code is a non-weighted BCD (8421) Code. Excess-3 Code is derived from 8421 code by adding 0011 (3) to all code groups. It is a sequential code, thus can be a...

2709

学完计组后,我马上在「我的世界」造了台显示器,你敢信?

前言 今天的主题十分有趣,我们将在我的世界(Minecraft)这个游戏里,靠一个个逻辑门来组合实现一个简单的七段显示器,可以实现将选择的数字输出在显示器上。 我会从最基础的与或非实现开始,亲自画出电路原理图,并且用我的世界来带领大家领略数字电子技术的精妙之处。 本文所涉及的数电知识包括电路编码、基本逻辑门、组合电路。 当然,由于电路的精密性以及游戏里实现的复杂性,实现完整的电路是非常困难的,也会让人难以看懂,一下子就劝退了,这也就违背了我们学习知识的初衷。 所以,我会适当的对电路进行化简,让人看起来简单易

小林coding 5395
上一篇: cbw与cwd符号扩展的实际意义
下一篇: 小猹学图论
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值