2016-02-12 173 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。