汇编中的多变量代数
Multiple Variable Algebra in Assembly
尝试自学汇编 (masm win32),特别是使用用户输入进行多变量数学运算。我相信我已经完成了输入,但是我的 DOSBox32 会在输入后崩溃。我的猜测是由于我的数学部分,posted 下面。任何帮助将不胜感激,特别是如果您可以提供有关如何编写 similar 方程的见解,因为我正在尝试自学,我宁愿直接查看模式和方法答案。谢谢!!
;Math ....... A = ((B * 3) + 6) / (X + D)
mov ax,numB
mov bx,3
imul bx ;Multiply bx (3) by ax (B)
add ax,6 ;Add 6 to the above
mov bx,numX
add bx,numD ;Add X + D
idiv bx ;Divide bx (X + D) by ax ((B * 3) + 6)
mov res,ax ;Set ax as result
int 21h
;Display Result
mov ax,@data
mov ds,ax ;set DS to point to the data segment
lea dx,ResPrompt ;get ResPrompt
mov ah,09h ;display string function
int 21h ;display "A = "
mov ax,@data
mov ds,ax ;set DS to point to the data segment
lea dx,res ;get result
mov ah,09h ;display string function
int 21h ;display result
我可以在这之前post我的代码,以防这里没有任何内容会导致崩溃。
失败的第一个原因。
mov res,ax ;Set ax as result
int 21h
调用DOSapi时,AH
需要保存函数号。你没有指定一个。根据您的计算结果,这一系列指令可能导致任何结果!
失败的第二个原因。
mov bx,numX
add bx,numD ;Add X + D
idiv bx
做除法时,除以零总要心存疑虑。根据 numX 和 numD 变量的实际内容,这种情况很容易发生。
失败的第三个原因。
lea dx,res ;get result
mov ah,09h ;display string function
int 21h ;display result
此 DOS 输出函数需要一个指向以“$”结尾的 text 的指针。您的 res 变量保存二进制值,当然不是计算结果的文本表示。
有关显示数字的精彩解释,请参见
Displaying numbers with DOS.
insight on how to code a similar equation
检查数学运算是否有任何溢出很重要。当方程中的值来自 user 输入时尤其如此。看第二个失败的原因。
请注意 idiv bx
实际上是 DX:AX
除以 BX
。由于较早的乘法,您的代码不必初始化 DX
。但是,如果股息没有这样的乘法(任何奇数方程)怎么办?
因为乘法的结果是 DX:AX
,所以使用级联加法加 6 会更正确:
add ax, 6 ;Add 6 to the above
adc dx, 0
mov ax,@data
mov ds,ax
mov ax,@data
mov ds,ax
看到你重复设置 DS
让我怀疑你是否在实际计算之前设置了它。
如果您在程序的早期初始化 DS
,那么您对整个程序都非常有用。
尝试自学汇编 (masm win32),特别是使用用户输入进行多变量数学运算。我相信我已经完成了输入,但是我的 DOSBox32 会在输入后崩溃。我的猜测是由于我的数学部分,posted 下面。任何帮助将不胜感激,特别是如果您可以提供有关如何编写 similar 方程的见解,因为我正在尝试自学,我宁愿直接查看模式和方法答案。谢谢!!
;Math ....... A = ((B * 3) + 6) / (X + D)
mov ax,numB
mov bx,3
imul bx ;Multiply bx (3) by ax (B)
add ax,6 ;Add 6 to the above
mov bx,numX
add bx,numD ;Add X + D
idiv bx ;Divide bx (X + D) by ax ((B * 3) + 6)
mov res,ax ;Set ax as result
int 21h
;Display Result
mov ax,@data
mov ds,ax ;set DS to point to the data segment
lea dx,ResPrompt ;get ResPrompt
mov ah,09h ;display string function
int 21h ;display "A = "
mov ax,@data
mov ds,ax ;set DS to point to the data segment
lea dx,res ;get result
mov ah,09h ;display string function
int 21h ;display result
我可以在这之前post我的代码,以防这里没有任何内容会导致崩溃。
失败的第一个原因。
mov res,ax ;Set ax as result int 21h
调用DOSapi时,AH
需要保存函数号。你没有指定一个。根据您的计算结果,这一系列指令可能导致任何结果!
失败的第二个原因。
mov bx,numX add bx,numD ;Add X + D idiv bx
做除法时,除以零总要心存疑虑。根据 numX 和 numD 变量的实际内容,这种情况很容易发生。
失败的第三个原因。
lea dx,res ;get result mov ah,09h ;display string function int 21h ;display result
此 DOS 输出函数需要一个指向以“$”结尾的 text 的指针。您的 res 变量保存二进制值,当然不是计算结果的文本表示。
有关显示数字的精彩解释,请参见
Displaying numbers with DOS.
insight on how to code a similar equation
检查数学运算是否有任何溢出很重要。当方程中的值来自 user 输入时尤其如此。看第二个失败的原因。
请注意
idiv bx
实际上是DX:AX
除以BX
。由于较早的乘法,您的代码不必初始化DX
。但是,如果股息没有这样的乘法(任何奇数方程)怎么办?因为乘法的结果是
DX:AX
,所以使用级联加法加 6 会更正确:add ax, 6 ;Add 6 to the above adc dx, 0
mov ax,@data mov ds,ax mov ax,@data mov ds,ax
看到你重复设置 DS
让我怀疑你是否在实际计算之前设置了它。
如果您在程序的早期初始化 DS
,那么您对整个程序都非常有用。