以 8086 汇编语言打印出十进制值



我目前正在做一个项目,需要我提示用户输入三个输入(长度、宽度和高度),然后计算体积(长宽高)。计算完成后,我在打印结果时遇到问题。有没有办法打印出十进制值?

.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

这可以通过除法/模法简单地完成。例如,如果我们有一个 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

我会把汇编翻译留给你;)

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 汇编程序中不可用。

最新更新