2016-02-12 4 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 

В psuedocode, алгоритм будет выглядеть примерно так:

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 

T о печати целых чисел без знака вы можете сделать это:

call print_num_uns 

В качестве примера, если вы разместили этот код в вашей программе:

mov ax, -10 
call print_num 

Он должен отобразить на консоль:

-10 

Обратите внимание:: эти макросы и функции являются функцией EMU8086 и не доступны в других 8086 как semblers.

Смежные вопросы