在 irvine 汇编中查找球体的体积

Finding the volume of a sphere in irvine assembly

我在我的程序集 class 中被分配了一个任务来创建一个简单的程序来查找给定用户输入的球体的体积,我必须显示一条消息,然后显示带有分数的体积...我想出了以下代码,但不幸的是,我对余数的去向以及如何调用它们感到困惑。任何人都知道我在哪里搞砸了以及如何解决它?

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!由于 16*16 对于 AL 寄存器来说已经太大了,您最终只能使用非常有限的可用数字。

第三次乘法问题继续。这里因为 piMul 被定义为双字 mul 使用 EAX 但只有 AX 具有来自先前代码的确定值。

mul piMul

您可以定义 radius 一个双字并写入

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

此外,正如迈克尔所说,WriteDec 需要数字本身,而不是数字地址。所以删除 OFFSET 标签。