汇编-压缩BCD的算术运算

 

(这里讨论的指令仅适用于32位模式下的编程。)压缩二进制编码的十进制整数,或者称为压缩的BCD整数, 在每个字节中存放两个十进制数字。回忆一下在第1章中讲到的关于二进制编码的十进制整数的内容。为了简化代码编写, 我们只使用无符号BCD数。数值以小端序存放,最低十进制数字存放在最低地址,每个数字用4位表示。如果有奇数个数字,则最高的半字节用零填充。存储的大小可变:

 

压缩十进制存储至少有两个优点:
数据几乎可有任意个数的有效数字。这使得能以极高的精度执行计算。

将压缩十进制数转换为ASCII码(或者反之) 相对简单。

DA A(加法后的十进制调整) 和DAS(减法后的十进制调整) 这两条指令对加法和减法运算后的结果进行调整。遗憾的是,目前对于乘法和除法还没有这样的指令。在这些情况下,数值必须是非压缩的,执行乘法或除法后,再重新压缩。

DAA将两个压缩BCD码相加后的结果调整为压缩BCD码

在32位模式下, DA A(加法后的十进制调整) 指令将ADD或ADC指令产生在AL中的和数转换为压缩十进制格式。

例如,下面的指令将压缩十进制数35和48相加。二进制和数(7Dh)被调整为83h,即35和48的压缩十进制和数。

复制代码
.386  
.model flat,stdcall 
option casemap:none
.stack 4096

Include Irvine32.inc
includelib Irvine32.lib

ExitProcess PROTO,dwExitCode:DWORD  
 
.data       
 
.code   
main PROC   
    
    mov al,35h
    add al,48h   ;al=7Dh    两个压缩BCD码相加
    daa          ;al=83h    将两个压缩BCD码相加后的结果调整为BCD码



    INVOKE ExitProcess,0  
main ENDP   
END main
复制代码

 

 

示例下面的程序将两个16位压缩十进制整数相加,并将和数保存在一个压缩双字中。加法要求和数变量的存储空间比操作数多一个数字:

复制代码
.386  
.model flat,stdcall 
option casemap:none
.stack 4096

Include Irvine32.inc
includelib Irvine32.lib

ExitProcess PROTO,dwExitCode:DWORD  
 
.data   
packed_1 WORD 4536h 
packed_2 WORD 7207h 
sum DWORD ?

 
.code   
main PROC   
    
    ;初始化和数及索引
    mov sum,0
    mov esi,0

    ;低字节相加
    mov al,BYTE PTR [esi+packed_1]
    add al, BYTE PTR [esi+packed_2]  ;al=3D
    daa                              ;al=43
    mov BYTE PTR sum[esi] , al       ;保存低字节

    ;高字节相加,包括进位
    inc esi
    mov al,BYTE PTR [esi+packed_1]
    adc al, BYTE PTR [esi+packed_2]   ;al=B7
    daa
    mov BYTE PTR sum[esi] , al       ;保存高字节

    ;如果高字节有进位,也保存给进位
    inc esi
    mov al,0
    adc al,0
    mov BYTE PTR sum[esi] , al       ;保存进位

    ;用16进制显示和数
    mov eax,sum
    call WriteHex
    call Crlf


    INVOKE ExitProcess,0  
main ENDP   
END main
复制代码

 

 

DAS将两个压缩BCD码相减后的结果调整为压缩BCD码 

 

复制代码
.386  
.model flat,stdcall 
option casemap:none
.stack 4096

Include Irvine32.inc
includelib Irvine32.lib

ExitProcess PROTO,dwExitCode:DWORD  
 
.data   
packed_1 WORD 4536h 
packed_2 WORD 7207h 
sum DWORD ?

 
.code   
main PROC   
    
    mov al,85h
    sub al,48h    ;al=3Dh
    das          ;al=37h   将两个压缩BCD码相减后的结果调整为压缩BCD码



    INVOKE ExitProcess,0  
main ENDP   
END main
复制代码

 

 

 

 

 

 

 

posted @   天子骄龙  阅读(236)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示

目录导航