【问题标题】:Assembly - Converting Binary to Decimal in FASM汇编 - 在 FASM 中将二进制转换为十进制
【发布时间】:2014-07-20 06:32:48
【问题描述】:

我正在汇编 (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

【问题讨论】:

  • “这个问题以前从未在 Stack Overflow 中提出过”。真的吗?对我来说,您似乎想打印寄存器的值,这在之前肯定已经被问过(例如,参见stackoverflow.com/questions/15621258/…)。您使用的是 FASM 而不是 NASM/MASM/TASM 这一事实并不能真正使它成为一个独特的问题。

标签: assembly binary x86-16 fasm


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-24
    • 2016-10-16
    • 2015-06-02
    • 2015-02-04
    • 1970-01-01
    • 2012-06-02
    • 2012-04-02
    • 1970-01-01
    相关资源
    最近更新 更多