尝试自学装配(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
我可以在此之前发布我的代码,以防这里的任何内容都不会导致崩溃。
答案 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
,那么您对整个计划大多有用。