装配中的多变量代数

时间:2018-03-30 02:02:51

标签: assembly masm

尝试自学装配(masm win32),特别是用户输入进行多变量数学运算。我相信我已完成输入,但输入后我的DOSBox32会崩溃。我的猜测是由于我的数学部分,发布在下面。任何帮助都会非常感激,特别是如果你可以提供有关如何编码类似方程的见解,因为我正在尝试自学,我宁愿看到模式和方法而不是直接答案。谢谢!!

;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

我可以在此之前发布我的代码,以防这里的任何内容都不会导致崩溃。

1 个答案:

答案 0 :(得分:2)

失败的第一个原因。

mov res,ax      ;Set ax as result
int 21h

调用DOS api时,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输出函数需要一个指向" $" -terminated 文本的指针。您的 res 变量包含二进制值,当然不是计算结果的文本表示 有关显示数字的绝佳解释,请参阅 Displaying numbers with DOS

  

洞察如何编码类似的方程式

  • 检查数学运算是否有任何溢出非常重要。当等式中的值来自用户输入时,尤其如此。看到失败的第二个原因。

  • 请注意,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,那么您对整个计划大多有用。