Сборка — Преобразование двоичного в десятичное в FASM

Я делаю сумму и подсчет в ассемблере (FASM), пытаясь получить результат в десятичном виде. Я пишу значения, которые я суммирую в десятичном виде. Когда я запускаю его, он действительно дает мне вывод, но это двоичный вывод. Я могу перевести в десятичное число самостоятельно, но я действительно хочу, чтобы вывод был уже десятичным.

name "add-sub"

org 100h

mov al, 10       ; bin: 00001010b
mov bl, 5        ; bin: 00000101b

add bl, al

sub bl, 1

mov cx, 8
print: mov ah, 2
       mov dl, '0'
       test bl, 10000000b
       jz zero
       mov dl, '1'
zero:  int 21h
       shl bl, 1
loop print

mov dl, 'b'
int 21h

mov ah, 0
int 16h

ret

person Community    schedule 30.05.2014    source источник
comment
Этот вопрос никогда раньше не задавался в Stack Overflow. Действительно? Мне кажется, что вы хотите напечатать значение регистра, которое, безусловно, было задано ранее (см., например, заголовок stackoverflow.com/questions/15621258/). Тот факт, что вы используете FASM, а не NASM/MASM/TASM, не делает этот вопрос уникальным.   -  person Michael    schedule 30.05.2014


Ответы (1)


Хотя вы записали значения в десятичном виде, ассемблер (FASM) преобразовал их в «компьютерный» формат, т.е. в двоичный. Чтобы получить десятичный вывод, вы должны преобразовать результат в «выходной» формат, т.е. ASCII. Метод подробно описан в книгах и в сети. Вот пример для ваших нужд (FASM, MSDOS, .com):

format binary as "com"
use16

org 100h

mov al, 10       ; bin: 00001010b
mov bl, 5        ; bin: 00000101b

add bl, al
sub bl, 1

movzx ax, bl
call AX_to_DEC

mov dx, DECIMAL
mov ah, 9
int 21h

;mov ah, 0
;int 16h

ret

DECIMAL  DB "00000$"            ; place to hold the decimal number

AX_to_DEC:
        mov bx, 10              ; divisor
        xor cx, cx              ; CX=0 (number of digits)

    First_Loop:
        xor dx, dx              ; Attention: DIV applies also DX!
        div bx                  ; DX:AX / BX = AX remainder: DX
        push dx                 ; LIFO
        inc cl                  ; increment number of digits
        test  ax, ax            ; AX = 0?
        jnz First_Loop          ; no: once more

        mov di, DECIMAL         ; target string DECIMAL
    Second_Loop:
        pop ax                  ; get back pushed digit
        or al, 00110000b        ; AL to ASCII
        mov [di], al            ; save AL
        inc di                  ; DI points to next character in string DECIMAL
        loop Second_Loop        ; until there are no digits left

        mov byte [di], '$'      ; End-of-string delimiter for INT 21 / FN 09h
        ret
person rkhb    schedule 30.05.2014