2016-02-12 126 views
3

我目前正在研究一个需要我提示用户输入三个输入(长度,宽度,高度为&)然后计算音量(l w h)的项目。计算完成后,我在打印结果时遇到问题。有没有办法打印出十进制值?在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 
+0

“有没有办法打印出十进制值?”是的,当然 - 将其转换为字符串并打印出来。 – MikeCAT

+0

cmd会怎么样?我在google搜索上找不到它 –

+0

这已经被问过很多次了。见例如http://stackoverflow.com/search?q=%5Bmasm%5D+print – Michael

回答

2

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

我会离开大会翻译给你;)

0

EMU8086有一套包含的宏,并有一个功能,将做你想做的。添加到您的汇编文件的顶部:

include "emu8086.inc" 

正上方END Main添加这些新线的两个

Main ENDP 

DEFINE_PRINT_NUM 
DEFINE_PRINT_NUM_UNS 

END Main 

在你的代码现在任何地方,你需要打印一个符号整数控制台,你可以简单地把价值AX做:

call print_num 

ŧ Ø打印无符号整数,你可以这样做:

mov ax, -10 
call print_num 

应该显示这个控制台:

-10 

,如果你在你的程序放在这个代码

call print_num_uns 

举个例子请注意:这些宏和函数是EMU8086的一个功能,在其他8086中不可用semblers。