1

我正在汇编 (FASM) 中进行求和和分运算,试图得到十进制的结果。我写了我将总结 int decimal 的值。当我运行它时,它确实给了我一个输出,但它是一个二进制输出。我可以自己翻译成十进制,但我真正想要的是输出已经是十进制。

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
4

1 回答 1

0

尽管您将值写入十进制,但汇编器 (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
于 2014-05-30T16:26:42.947 回答