4

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

.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
4

2 回答 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

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

于 2016-02-13T04:59:02.943 回答
1

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

于 2016-02-13T05:00:48.690 回答