汇编-压缩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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)