簡體   English   中英

在irvine裝配中找到球體的體積

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM