关于BCD码的疑问

oldgameman 2002-09-05 01:16:45
请问我直接用DIV,ADD,SUB等指令进行二进制计算后取得计算后的二进制结果然后在高级语言中对它进行处理不就行了么?
为什么还要用DAA,DAS等进行BCD码的调整呢?
DAA,DAS等主要用于什么方面的用途?
我不明白。
比如:

;计算W<-X+Y+24-Z
;X,Y,Z都为字格式

MOV AX,X ;将X的低位移到AX
MOV DX,X+2 ;将X的高位(X+2)移动到DX
;因为在INTEL X86中,AX保存字的低半位,
;DX保存字的高半位

ADD AX,Y ;将Y的低半位同AX中的X的低半位相加
ADC DX,Y+2 ;将Y的高半位同DX中的X的高半位相加
ADD AX,24 ;将十进制数24和AX相加(因为字的半位是8位,
;最多可以表示至十进制的255,因24小于255,
;只需同8位的字相加即可

ADC DX,0 ;因为24是8位数,高位为全0,所以仅需加上CF
;中的进位即可

SUB AX,Z ;将Z的低位同AX相减
SBB DX,Z+2 ;将Z的高位同DX相减
MOV W,AX ;将AX的内容传给W的低位
MOV W+2,DX ;将DX的内容传给W的高位

;计算完毕
;最终W,W+2即是要求的结果


再看:


MOV AL,BCD1
ADD AL,BCD2
DAA
MOV BCD3,AL
MOV AL,BCD1+1
ADC AL,BCD2+1
DAA
MOV BCD3+1,AL


最后BCD3,BCD3+1中的内容就是经过BCD调整后的结果
我不明白这和上面那个例子中的W,W+2有什么本质上的不同?
本质上两者都是计算的结果而已,只不过经过BCD调整后的数已经不是纯粹的二进制数,比W,W+2要容易计算一点而已啊?


请高手解答两者的不同之处

...全文
59 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
piziwolf 2002-09-06
  • 打赏
  • 举报
回复
我的理解是,在cpu看来,bcd和bin,hex没什么区别,是你怎么看待的问题,bcd码更接近人的习惯吧,所以才会有它
Areslee 2002-09-05
  • 打赏
  • 举报
回复
没有什么不同
oldgameman 2002-09-05
  • 打赏
  • 举报
回复
up先~
giantzz 2002-09-05
  • 打赏
  • 举报
回复
X是字还是双字,你说是字
MOV AX,X
MOV DX,X+2
如果是字,并且X、Y、Z是连续存入的,那个DX中就该是Y的值,而不是你说的是X的高位,还有我要提醒你,两个操作数的类型应一至
"因为在INTEL X86中,AX保存字的低半位,DX保存字的高半位",这是什么意思,请指教,谢了
用户 昵称 2002-09-05
  • 打赏
  • 举报
回复
我想请教1个问题
1)这里应不应该添加一句
'[]=================================[]
CLC ;清除cf
'[]=================================[]

MOV AX,X ;将X的低位移到AX
MOV DX,X+2 ;将X的高位(X+2)移动到DX
;因为在INTEL X86中,AX保存字的低半位,
;DX保存字的高半位

ADD AX,Y ;将Y的低半位同AX中的X的低半位相加
ADC DX,Y+2 ;将Y的高半位同DX中的X的高半位相加
ADD AX,24 ;将十进制数24和AX相加(因为字的半位是8位,
;最多可以表示至十进制的255,因24小于255,
;只需同8位的字相加即可

ADC DX,0 ;因为24是8位数,高位为全0,所以仅需加上CF
;中的进位即可
SUB AX,Z ;将Z的低位同AX相减
SBB DX,Z+2 ;将Z的高位同DX相减
MOV W,AX ;将AX的内容传给W的低位
MOV W+2,DX ;将DX的内容传给W的高位

;计算完毕
;最终W,W+2即是要求的结果

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧