汇编踩过的坑(error A1010,A2085 ,divide error,A2070,注意事项)
最近也是在学汇编语言,上机的时候发现错误很不友好,总是断断续续,上网去查询,又查不到,花费大半天时间才找出更改办法。为了让你们可以更好的学习汇编语言,我总结了以下几个坑。
fatal error A1010: unmatched block nesting : main
如图所示:
这个error其实是由于前后段名不相同,前后子程序名不相同,这里的main(可以是其它的段名)会与代码段最后结束相呼应。
要改的话:
其实你可以直接用集成环境的模板代码来写,但初学,最好按上图来,从复杂-》简便的学习过程。
其中也要理解它们各自的意思。
main endp
s3 ends
end main
endp 表示PROC所定义的过程结束. (end procedure)
ends 表示SEGMENT定义的段结束. (end segment)
end 程序结束.
error A2085: instruction or register not accepted in current CPU mode
如图所示:
其实这里是由于代码段使用了与系统内部的什么东西重名,就好像高级语言编译器这些也是会报错的,这里只是举了一个例子:str,但还有其它的要自己去探索了。
要改的话很简单(改名即可)
divide error
如图所示:
这是代码可以通过编译,但不能正常运行
这一般是因为除数和被除数的位数溢出问题,这就要看你两个数的位数了,只有任意一个大于16位的寄存器,那就要用dx,ax来进行除法运算。
同时一定要xor dx,dx
且要在循环内
没写这条,系统默认为8位寄存器
还有就是div或mul后ax,dx的值都会改变要注意
erroe A2070: invalid instruction operands
这个错误啊经常犯啊,这种都是因为前后的类型不同,要字对字,字节对字节,或者是因为寄存器使用不佳,比如地址变化一般使用si,di这种变址寄存器,cx用于计数什么的。
注意事项
(1)输出时ax会变
mov ah,xxx
int 21h
每次执行这步,ax会变(记得先存ax就行)
(2)在汇编中使用指针功能的时候,要注意!指针指向下一个单元
(3)
lea dx,math
mov ah,9h
int 21h
顺序不能换,换了会变乱码
(4)用al,ah的时候要注意另一个是否清零
这门课上得差不多了,其它还有什么大问题将日后补充!