汇编学习笔记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码则是,一个字节只有低四位去表示一个十进制数,高四位空闲不用。
比如刚才的43,用非压缩BCD码表示就是xxxx0100 xxxx0011

BCD码其实用的不多,但是考试可能会涉及到,所以我们着重学一下BCD码的调整指令

二、BCD调整指令

什么是BCD调整指令呢?或者说为什么要调整呢?

我们刚才说BCD码用得不多,所以任何CPU都没有设置专门的BCD码的运算指令,只能通过正常普通的二进制运算指令来进行。

这就出问题了。

比如我们想算一个十进制的35+35,我们希望得到的是一个为70D的BCD码(0111 0000)
但是我们算一下,35的BCD码是0011 0101,按照二进制的运算方式,35+35就成了0110 1010。
仔细看,后面两个5+5,本应该满十进一的,结果低四位的二进制是可以表示10的,就没有对高四位进位,这样就与我们期望的结果不匹配了。

再举个例子,比如38加38,我们期望得到76(0111 0110)
但是0011 1000算完后是0111 0000(70D),这里是低位产生了进位,但并不是满十进位,而是带走了一个16,所以依然比我们期望的低了6。

这样我们就找到调整的方法了——就是加6

BCD调整指令主要有四种(乘法和除法的不做要求):
DAA压缩型BCD数加法调整指令
AAA非圧缩型BCD数加法调整指令

DAS压缩型BCD数减法调整指令
AAS非圧缩型BCD数减法调整指令

1、DAA
DAA是对在AL中的和进行调整,重新产生一个BCD码,放在加法指令后面
格式:DAA
操作数隐含为AL寄存器

方法为:

  • 如果AL中的低四位在A~F之间(即低四位大于10D),或者AF为1(即低四位产生进位),则AL <- AL+6,且将AF置为1.
  • 如果AL中的高四位在A~F之间(即高四位大于10D),或者CF为1(即高四位产生进位),则AL <- AL+60H,且将CF置为1.

2、DAS
DAS是对在AL中的差进行调整,重新产生一个BCD码,放在减法指令后面
格式:DAS
操作数隐含为AL寄存器

方法为:

  • 如果AL中的低四位在A~F之间(即低四位大于10D),或者AF为1(即低四位产生进位),则AL <- AL-6,且将AF置为1.
  • 如果AL中的高四位在A~F之间(即高四位大于10D),或者CF为1(即高四位产生进位),则AL <- AL-60H,且将CF置为1.

注:DAA和DAS要紧跟在加法减法指令之后

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页