在8086汇编语言中打印十进制值

3

我目前正在处理一个项目,需要提示用户输入三个值(长度、宽度和高度),并计算体积(lwh)。在计算完成后,我无法将结果打印出来。有没有办法打印十进制数值?

.MODEL  SMALL
 .STACK 100h  

.DATA
l  DB ?
w  DB ?
h  DB ?
v  DB ?
M1 DB 10,13, "Please enter the length: $"
M2 DB 10,13, "Please enter the width : $"
M3 DB 10,13, "Please enter the height: $"
M4 DB 10,13, "The volume is:$"          

   .CODE
    Main    PROC
    mov ax, @data       ; getting data segment address
    mov ds, ax          ; initializing the data segment  

    mov dx, offset M1   ; prompting user for a value
    mov ah, 09h     ; writing string to STDOUT
    int 21h             ; BIOS routines
    mov ah, 01h     ; reading in from STDIN, input stored in al
    int 21h
    mov bl, al
    sub ax,ax           ; clearing ax register for the next input
    sub bl, 30h
    mov l, bl
    sub bx,bx

    mov dx, offset M2
    mov ah, 09h
    int 21h 
    mov ah, 01h
    int 21h
    mov bl, al
    sub ax,ax
    sub bl, 30h
    mov w, bl
    mov al, l   
    mul bl 
    mov v, al
    sub ax, ax
    sub bx,bx

    mov dx, offset M3
    mov ah, 09h
    int 21h 
    mov ah, 01h
    int 21h
    sub al, 30h 
    mov h,  al 
    sub bx, bx
    mov bl, v
    mul bx
    mov v, al
    sub ax, ax
    sub bx,bx  

    mov dx, offset M4 
    mov ah, 09h
    int 21h 
    sub dx, dx
    mov dx, offset v
    mov ah, 09h
    int 21h
    mov ax, 400ch           ; returning control to OS
    int 21h     
    Main ENDP
    END Main

有没有一种方法可以打印出十进制值?当然可以——将其转换为字符串并打印出来。 - MikeCAT
这个怎么操作?我在谷歌搜索中找不到。 - John Alto
这个问题已经被问过很多次了。请参见例如http://stackoverflow.com/search?q=%5Bmasm%5D+print - Michael
2个回答

3

这可以通过除法/取模简单实现。例如,如果我们有一个1字节的值要转换为十进制数 - 比如152 - 我们可以先将152除以100,然后对其应用模10运算,得到结果为1(数字中的第一位)

(152 / 100) % 10 = 1

我们可以将结果保存到字符串缓冲区以便稍后打印,同时处理下一位数字。对于下一位数字,我们重复这个过程,只是除以10而不是100。

(152 / 10) % 10 = 5

将此结果存储在缓冲区中的下一个插槽中。重复此过程,直到您将值除以1时,您可以使用模数:

152 % 10 = 2

在伪代码中,该算法的示例代码如下:
buffer: byte[4]
buffer[3] = 0       ;; Null-terminate the buffer
buffer_index = 0

value: 153
divisor: 100        ;; Increase this for values larger than 999

while divisor > 0 do
    buffer[buffer_index] = (value / divisor) % 10
    buffer_index = buffer_index + 1
    divisor = divisor / 10
repeat

print buffer

我会把汇编翻译交给你处理 ;)

1
< p > < em > EMU8086 包含一组宏,还有一个函数可以实现您想要的功能。将以下内容添加到您的汇编文件顶部:

include "emu8086.inc"

END Main 上方添加以下两行:
Main ENDP

DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS

END Main

现在,无论您的代码中何处需要将有符号整数打印到控制台,您只需将该值放入AX并执行以下操作即可:
call print_num

要打印无符号整数,可以这样做:

call print_num_uns

举个例子,如果你将这段代码放入你的程序中:

mov ax, -10
call print_num

它应该在控制台中显示以下内容:
-10

请注意:这些宏和函数是 EMU8086 的一个特性,不可在其他 8086 汇编器中使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接