2015-09-18 2 views
1

Мне присвоено задание в классе сборки, чтобы создать простую программу для поиска объема сферы с учетом ввода пользователя. Мне нужно отобразить сообщение, за которым следует том с помощью дробная сумма ... Я придумал следующий код, но, к сожалению, я в тупике, где остаются остатки, и как таковые, как их называть. У кого-нибудь есть идея, где я запутался и как я могу это исправить?Поиск объема сферы в сборке irvine

INCLUDE Irvine32.inc 
.data 
radius byte 0 
prompt byte "Please enter the radius of the sphere~ ", 0 
volumeMessage byte "The volume of the sphere is~ ", 0 
period byte ".", 0 
volumeNumber dword 0, 0dh,0ah 
volumeFraction dword 0, 0dh,0ah 
piMul dword 88 
piDiv dword 21 

.code 
main PROC 
    mov edx, OFFSET prompt 
    call WriteString 
    call readdec 
    mov radius, al 

    mul radius 
    mul radius 

    mul piMul 

    div piDiv 

    mov volumeNumber, eax 
    mov volumeFraction, edx 

    mov edx, OFFSET volumeMessage 
    call WriteString 
    mov edx, OFFSET volumeNumber 
    call WriteDec 
    mov edx, OFFSET period 
    call WriteString 
    mov edx, OFFSET volumeFraction 
    call WriteDec 

    call WaitMsg    
    exit 
main ENDP 
END main 
+0

Я ошибаюсь, я смущен, почему, когда я пытаюсь вытащить остаток из edx, он остается таким же, как результат в eax. –

ответ

3

От Irvine32.asm:

;----------------------------------------------------- 
WriteDec PROC 
; 
; Writes an unsigned 32-bit decimal number to 
; the console window. Input parameters: EAX = the 
; number to write. 

Таким образом, вместо:

mov edx, OFFSET volumeNumber 
call WriteDec 

вы должны использовать:

mov eax, volumeNumber 
call WriteDec 

И аналогично для volumeFraction.

+0

Спасибо, что исправил его так, чтобы он печатал оба числа. Хотя фракция ошибочна, по крайней мере, ее распечатка! –

+0

nevermind its correct –

+0

@RickSchlund: Если бы этот ответ был вам полезен, и он предоставил ответ, который устранил вашу проблему, хороший этикет должен принять ответ. Вы можете узнать больше о [принятии ответов] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) –

1

Благодаря неаккуратного кода ваша программа может обрабатывать только радиусы меньше 16.

mov radius, al 
mul radius 
mul radius 

После первого результата умножения в АХ, но второе умножение будет использовать только AL! Поскольку 16 * 16 уже для большого регистра AL, вы получаете очень ограниченный диапазон доступных номеров.

Проблемы продолжаются с третьим умножением. Здесь, поскольку piMul определяется как dword, mul использует EAX, но только AX имеет определенное значение из предыдущего кода.

mul piMul 

Вы можете определить радиус двойное слово и написать

mov radius, eax 
imul eax, radius 
imul eax, radius 
mul piMul 
div piDiv 

Кроме того, как Майкл сказал WriteDec ожидает, что само число, а не адрес с номером. Поэтому снимите отметку OFFSET.

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