[英]Finding the volume of a sphere in irvine assembly
在裝配類中,我得到了一個分配,以創建一個簡單的程序來找到給定用戶輸入的球體的體積,我必須顯示一條消息,然后是小數的體積...我想出了后面的代碼,但不幸的是,剩下的地方以及如何稱呼它們為難。 任何人都知道我要搞砸了,我該如何解決?
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
從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
。
由於代碼草率,您的程序只能處理半徑小於16的半徑。
mov radius, al
mul radius
mul radius
在第一個乘法結果在AX中之后,但是第二個乘法將僅使用AL! 由於AL寄存器的16 * 16已經很大,因此您得到的可用數字范圍非常有限。
第三次乘法仍然存在問題。 在這里,因為piMul被定義為dword,所以mul
使用EAX,但只有AX具有先前代碼中的定義值。
mul piMul
你可以定義一個半徑和一個雙字
mov radius, eax
imul eax, radius
imul eax, radius
mul piMul
div piDiv
此外,正如Michael所說, WriteDec期望數字本身而不是數字的地址。 因此,刪除OFFSET標簽。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.