在 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 标签。
我在我的程序集 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 标签。