Assembly 如何在程序集x8086中将二进制转换为十进制?

Assembly 如何在程序集x8086中将二进制转换为十进制?,assembly,x86-16,Assembly,X86 16,我发现一些代码确实有效,但我不知道为什么这些代码有效 为什么结合RCL和ADC可以将二进制转换为十进制,这个算法好吗 如何解释这一点,有没有更好的代码 ;input=R5R6R7 ;output=buffer0 - buffer7 DATA SEGMENT R0 DW (?) ;0000H R1 DW (?) ;0002H R2 DW (?) ;0004H R3

我发现一些代码确实有效,但我不知道为什么这些代码有效

为什么结合RCL和ADC可以将二进制转换为十进制,这个算法好吗

如何解释这一点,有没有更好的代码

;input=R5R6R7
;output=buffer0 - buffer7

DATA    SEGMENT

    R0      DW      (?)     ;0000H
    R1      DW      (?)     ;0002H
    R2      DW      (?)     ;0004H
    R3      DW      (?)     ;0006H
    R4      DW      (?)     ;0008H
    R5      DW      (?)     ;000AH
    R6      DW      (?)     ;000CH
    R7      DW      (?)     ;000EH

    buffer0 DB      (?)     ;001CH
    buffer1 DB      (?)
    buffer2 DB      (?)
    buffer3 DB      (?)
    buffer4 DB      (?)
    buffer5 DB      (?)
    buffer6 DB      (?)
    buffer7 DB      (?)
    buffer8 DB      (?)
    buffer9 DB      (?)

DATA    ENDS


BCTD    PROC    NEAR
    MOV     CX, 8
    LEA     BX, [buffer0]

CLR_BUFFER:
    MOV     BYTE PTR [BX], 0
    INC     BX
    LOOP    CLR_BUFFER

    MOV     CX, 48
BCTD_LOOP:
    CLC
    RCL     R7, 1
    RCL     R6, 1
    RCL     R5, 1

    MOV     AL, buffer0
    ADC     AL, AL
    DAA
    MOV     buffer0, AL

    MOV     AL, buffer1
    ADC     AL, AL
    DAA
    MOV     buffer1, AL

    MOV     AL, buffer2
    ADC     AL, AL
    DAA
    MOV     buffer2, AL

    MOV     AL, buffer3
    ADC     AL, AL
    DAA
    MOV     buffer3, AL

    MOV     AL, buffer4
    ADC     AL, AL
    DAA
    MOV     buffer4, AL

    MOV     AL, buffer5
    ADC     AL, AL
    DAA
    MOV     buffer5, AL

    MOV     AL, buffer6
    ADC     AL, AL
    DAA
    MOV     buffer6, AL

    MOV     AL, buffer7
    ADC     AL, AL
    DAA
    MOV     buffer7, AL

    LOOP    BCTD_LOOP
    RET
BCTD    ENDP

buffer[]
保存最初设置为0的结果(压缩BCD)。在48位整数(
RCL…RCL…RCL
)的每一个左移位处,结果乘以2,并添加隔离二进制数字(移位位)(
ADC AL,AL
)。其原理与将十进制数转换为整数(乘以10,再加上独立的十进制数字)的原理相同<代码>DAA处理添加后的溢出。第一个
ADC
的进位来自最后一个RCL,但是下面的
ADC
DAA
获取进位标志

优点:

  • 没有分裂
  • 代码可以很容易地调整为更大的整数
缺点:

  • 结果是BCD压缩。您需要一些努力才能将其转换为 十进制ASCII字符串
  • 前导零
  • 循环必须贯穿整个系统 每种情况下的位数。这对于较小的整数来说是昂贵的
顺便说一句:您的“输入”被处理为“big-endian”,而“buffer”则被处理为“little-endian”。至少当您想使用32位寄存器时,您会遇到麻烦(例如EAX-是的,您可以在16位模式下寻址)