汇编中的多变量代数

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

做除法时,除以零总要心存疑虑。根据 numXnumD 变量的实际内容,这种情况很容易发生。

失败的第三个原因。

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,那么您对整个程序都非常有用。