用汇编语言打印十进制数?

问题描述 投票:0回答:2

我正在尝试以十进制形式获取输出。请告诉我如何才能以十进制而不是 ASCII 形式获得相同的变量。

.model small
.stack 100h

.data

msg_1   db   'Number Is = $'
var_1   db   12

.code

add_1 proc
    mov ax, @data
    mov ds, ax
    mov ah, 09
    lea dx, msg_1
    int 21h
    mov ah, 02
    mov dl, var_1
    int 21h
    mov ah, 4ch
    int 21h
add_1 endp

end add_1
assembly x86 output decimal
2个回答
2
投票

您写的这三行:

mov ah, 02
mov dl, var_1
int 21h

打印由 var_1 变量中保存的 ASCII 代码表示的 字符

要打印十进制数,您需要进行转换。
您的 var_1 变量的值足够小 (12),因此可以使用专门设计的代码来处理 0 到 99 范围内的数字。该代码使用

AAM
指令 进行简单除法到 10.
add ax, 3030h
真正转换为字符。它之所以有效,是因为“0”的 ASCII 代码是 48(十六进制的 30h),并且因为所有其他数字都使用下一个更高的 ASCII 代码:“1”是 49,“2”是 50,...

mov al, var_1      ; Your example (12)
aam                ; -> AH is quotient (1) , AL is remainder (2)
add ax, 3030h      ; -> AH is "1", AL is "2"
push ax            ; (1)
mov dl, ah         ; First we print the tens
mov ah, 02h        ; DOS.PrintChar
int 21h
pop dx             ; (1) Secondly we print the ones (moved from AL to DL via those PUSH AX and POP DX instructions
mov ah, 02h        ; DOS.PrintChar
int 21h

如果您有兴趣打印大于 99 的数字,那么 看看我发布的一般解决方案 用 DOS 显示数字


0
投票

当数字较大且为正数,并且仅使用 BIOS(或输出到其他端口)时,请尝试使用堆栈作为内存的方法:

        push 0x29 ;just marker
        
        ;AX number must be here...
.l1     mov bx,10
        mov dx,0
        div bx
        add dx,48 ;convert to ASCII
        push dx  ;store the string
        cmp ax,0
        jnz .l1
        
.l2     pop ax
        cmp AX,0x29 ;we have marker?
        jz .l3
        call print_char_al ; print ASCII value in AL using BIOS or sent to port
        jmp .l2
.l3     ret
© www.soinside.com 2019 - 2024. All rights reserved.