汇编-ASCII十进制数和非压缩十进制数

 

非压缩十进制整数的高4位总是为零, 而ASCII十进制数的高4位则等于0011b。在任何情况下,这两种类型的整数的每个数字都占用一个字节。下面的例子展示了3402在两种格式下是如何存放的:

 

尽管ASCII算术运算执行得比二进制算术运算要慢, 但是它有两个明显的优点:

●无须在执行算术运算之前对串格式进行转换。

●使用假设的十进制小数点,使实数操作不会在做浮点数运算时存在舍人误差。

ASCII加法和减法允许操作数为ASCII格式或非压缩十进制格式, 而乘法和除法只能使用非压缩十进制数

 

 

AAA加法后拆分成非压缩BCD码 

 

在32位模式下, AAA(加法后的ASCII调整) 指令调整执行ADD或ADC指令后的二进制运算结果。假设两个ASCII数字相加产生的二进制结果存放在AL中, 则AAA将AL 转换为两个非压缩十进制数字并存入AH和AL。一旦成为非压缩格式,通过将AH和AL 与30h进行OR运算, 便可容易地将它们转换为ASCII码。

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

Include Irvine32.inc
includelib Irvine32.lib

ExitProcess PROTO,dwExitCode:DWORD  
 
.data       

 
.code   
main PROC   
    
    mov ah,0
    mov al,'8'  ;al=38h
    add al,'2'   ;al=al+32h=6Ah
    aaa          ;将al中的和拆分,十位放到ah中,个位放到al中,注意:非压缩格式
    ;8+2=10,1放到ah中,0放到al中
    ;ah=01h       al=00h
    or ax,3030h    ;转换成ASCII

    

    
    quit:
    mov eax,[esi]
    INVOKE ExitProcess,0  
main ENDP   
END main
复制代码

 

 aas减法后

 

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

Include Irvine32.inc
includelib Irvine32.lib

ExitProcess PROTO,dwExitCode:DWORD  
 
.data       

 
.code   
main PROC   
    
    mov ah,0     ;执行aas指令之前,根据Intelx86的规范,需要确保ah寄存器中的值为0
    mov al,'8'
    sub al,'9'  ;al=38h-39h=FFh=-1
    aas
    ;ah=FFh     al=09h

    
    
    quit:
    mov eax,[esi]
    INVOKE ExitProcess,0  
main ENDP   
END main
复制代码

 

AAM乘法后拆分成非压缩BCD码 

在32位模式下, A AM(乘法后的ASCII调整) 指令将MUL产生的二进制乘积转换为非压缩BCD码。乘法只能使用非压缩十进制数。

下面的例子实现5乘以6,并调整AX中的结果。调整后,AX=0300h,即30的非压缩十进制数的表示:

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

Include Irvine32.inc
includelib Irvine32.lib

ExitProcess PROTO,dwExitCode:DWORD  
 
.data       

 
.code   
main PROC   
    
    mov bl,05h
    mov al,06h
    mul bl        ;ax=001Eh=30
    aam           ;将al中数据拆分成非压缩BCD码,分别放在ah和al中
    ;ah=03h     al=00h
    
    quit:
    mov eax,[esi]
    INVOKE ExitProcess,0  
main ENDP   
END main
复制代码

 

AAD除法前将非压缩BCD码转换为二进制

在32位模式下, A AD(除法前的ASCII调整) 指令将AX中的非压缩十进制被除数转换为二进制, 为执行DIV指令做准备。

下面的例子将非压缩0307h转换为二进制数, 然后除以5。DIV指令在AL中生成商07h, 在AH中生成余数02h:

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

Include Irvine32.inc
includelib Irvine32.lib

ExitProcess PROTO,dwExitCode:DWORD  
 
.data       

 
.code   
main PROC   
    
    mov ax,0307h  ;0307h=BCD码37
    aad           ;将AX中的非压缩BCD码转换为二进制  ax=0025=37
    mov bl,5
    div bl         ;商al=07h=7          余数ah=02h=2


    
    quit:
    mov eax,[esi]
    INVOKE ExitProcess,0  
main ENDP   
END main
复制代码

 

 

 

 

 

posted @   天子骄龙  阅读(86)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
历史上的今天:
2022-12-26 win32-style类风格解析
2022-12-26 win32系统窗口类-按钮
2019-12-26 汽车
2019-12-26 礼尚往来
2019-12-26 网上银行账户
2019-12-26 注册的软件
点击右上角即可分享
微信分享提示

目录导航