Сглобяване - Преобразуване на двоични в десетични във 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