如何使用8086将ascii号码057836转换为打包的bcd号码

时间:2018-12-29 19:21:58

标签: assembly emu8086 bcd

我无法将ASCII编号转换为BCD编号。 我知道转换小数字是通过从每个数字中减去30h来完成的,但是对于这个大数字,我不知道如何处理它,因此我想将数字划分为字节,但是不确定这种想法是否正确或不是..

有什么帮助或建议吗?

1 个答案:

答案 0 :(得分:2)

打包的BCD编号057836不适用于单个16位寄存器。 emu8086不允许使用32位寄存器,因为自80386处理器以来,它已经可以在16位模式下使用。因此,使用两个寄存器来获取打包的BCD。我使用了AXDX。要在AX的最右边4位中找到新的BCD编号,您必须将AX的4位左移到DX

.MODEL small

.DATA
    bcd db "057836", 0

.CODE

main PROC
    mov ax, @data           ; Initialize DS
    mov ds, ax

    mov si, OFFSET bcd      ; Initialize registers for the loop
    mov ax, 0
    mov dx, 0

    loo:                    ; Loop through the ASCII string
    mov bl, [si]            ; Get a character
    cmp bl, 0               ; End of String reached?
    je endloo               ; Yes -> exit the loop

    ; Make space for a bcd number shifting left 4 bits from AX to DX
    ; 4 single shifts because emu8086 doesn't support `SHLD`
    shl ax, 1
    rcl dx, 1
    shl ax, 1
    rcl dx, 1
    shl ax, 1
    rcl dx, 1
    shl ax, 1
    rcl dx, 1

    and bl, 0Fh             ; Delete the ASCII-part (same as sub bl, 30h)
    or al, bl               ; Transfer number from bl to al

    inc si                  ; Next character
    jmp loo                 ; Once more
    endloo:

    ; At this point the register pair DX:AX contains the packed BCD number

    mov ax, 4C00h           ; Exit (0)
    int 21h                 ; Call MSDOS
main ENDP

END main