как преобразовать число ASCII 057836 в упакованное число BCD, используя 8086 - PullRequest
0 голосов
/ 29 декабря 2018

У меня проблемы с преобразованием чисел ASCII в числа BCD.Я знаю, что преобразование небольших чисел выполняется путем вычитания 30h из каждого числа, но с этим большим числом я не знаю, как с ним справиться, я подумал о делении числа на байты, но не уверен, правильна ли эта идея илине ..

Любая помощь или предложения?

1 Ответ

0 голосов
/ 30 декабря 2018

Упакованный BCD номер 057836 не помещается в один 16-битный регистр.emu8086 не позволяет использовать 32-битные регистры, поскольку это было возможно в 16-битном режиме начиная с процессора 80386.Итак, используйте два регистра, чтобы получить упакованный BCD.Я использовал AX и DX.Чтобы получить место для нового номера BCD в крайних правых 4 битах AX, необходимо сдвинуть влево 4 бита с AX на 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
...