当前位置: 首页 > 工具软件 > MASMPlus > 使用案例 >

关于使用dosbox与masm/MASMplus进行汇编语言的编译,link与执行中遇到问题的解决法小汇总(慢慢汇总更新)

王翰墨
2023-12-01

    本博文主要在参照了https://blog.csdn.net/yuzuruhanyu/article/details/80287419这篇博客,以及网络上各类咨询的基础上汇总而成。

    特意提示,本人水平有限,一些用词和解释可能并不十分准确,如果您有不同的看法或理解,敬请指正和探讨。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

一、在dosbox里遇见的错误:

    (1)在讲我们可能会遇到的错误之前,先讲下在我们使用dosbox来进行的操作,通常我们的第一步操作是设置虚拟磁盘,例:mount c d:\    或是    mount d d:\  因为dosbox在使用的开始时默认是给出了一个虚拟磁盘z,即开头即可见的z:\>,但必须知道的是这个磁盘z实际上是不存在的(废话),所以需要设置一个实际的物理磁盘才能进行后续的操作,比较有趣的是这里的设置其实可以设置到下一级目录,如 mount c d:\dos(这里的dos为实际d盘下的一个文件夹),同时,接下来的一步通常是c: 或者 d:,这一步的目的是在该盘目录下进行展开操作,如将运行d盘底下的debug程序时,有三步操作分别为:

              mount c d:\

              c:              //这里的c盘符对应设置的虚拟磁盘,mount c即c盘,mount d即d盘,与后一句的实际目录无关

              debug                 //该程序直接放在了d盘

       ps:还有一个常见的操作是cd(cd d:\)即目录转移,但要注意如果是对不同盘符进行操作(如你mount c e:\之后又想cd d:\ )这个时候往往会出错。

    (2)unable to open input file 

      在跟这网络上的教程走的时候,我们可能会遇到这样的错误,从字面上来理解这句报错的意思无法打开输入文件,情况主要有两种,我先说说我遇到的情况,开始时我是创建了一个一个汇编程序名字是letusbegin.asm,开始我以为是盘符和路径设置的不对,但调了一个多小时都没调明白,后来当我重命名程序名为2.asm时,发现程序就能正确地编译,链接且执行了。网络上说的第一种情况就是程序名字超出8位,所以我们在遇到这种情况的时候或者发生这种情况之前可以以防万一先给程序取一个简短的名字(名字太长也折腾自己不是)。

       //

       感谢评论区的朋友,让我想起来还有一个情况没有解决。这种情况其实也蛮让人哭笑不得的,简单的来说就是--masm无法找到这个文件。例如:文件后缀名不是asm。

       这种错误据我所知一般发生在win10系统,因为win10系统的文件后缀名一般是隐藏的,像历代的win系那样直接重命名是不好使的(当然也可以,但具体怎么改自己百度)这个问题比较好的解决方案是(举个例子)创建了一个txt文件之后,将其写入汇编指令,这时候再另存为成asm文件。

 

---------------------------------------------------明天继续更新---------------------------------------------------------------------------------------------------

   (2)illegal command :masm

     这里的错误是一个小小的细节方面的错误,在我们使用dosbox来操作masm时可能就会出现这样的错误,这里的错误一般是因为path(即路径)配置不正确。这里推荐按以下的方法输入:

    Z:>path=%path%;\masm

    另外一种是直接按目录来,例:

    Z:>path=Z:\;\masm

    造成这两个错误的原因一个可能是没有配置,另一方面可能是将masm记成了asm。

    而期间的解决之法,无他,唯手熟耳。

//

    更新,其实这个错误还有一个原因是当前目录下找不到masm.exe文件。(同理link等)在dosbox环境中使用外部命令时,对应的目录下必须要有该执行文件才行。

---------------------------------------------------明天继续更新---------------------------------------------------------------------------------------------------

    (3)extend error2 / illegal command:debug

      在我们在dosbox环境中通过debug来执行一个先前编译的exe文件,从而查看其执行过程中内存即寄存器中变化的时候,我们常常会进行以下操作:

     mount c g:\dos

     c:

     cd \asm

     debug 1.exe

     而期间可能会爆出两个错误,第一个便是illegal command,其原因一般是debug没有放在cd命令之后指定的盘符(cd命令不关键,主要是dosbox当前指定的目录下要有debug)第二个错误边是extend error2,该错误具体的含义并不明朗,有兴趣的朋友可以考证一下,我们在这里讨论它出现的原因。经过实践,这个错误的主要原因是1.exe没有存在。或者说因为一些原因没有在link时没有正确生成。此时的解决法很简单,再通过此前进行的link操作(注意设置好路径,关键词不要错):

    mount c g:\dos

    c:

   path=%path%;\masm

   cd\asm

   masm

   ....

   link

   ....

   此时就可以debug 1.exe了。而确认debug无误时,以后就可以不用再进行设置路径,与link的操作了。

   (4)error A2088: END directive required at end of file

   这个错误的出现实在令我困惑不解,我是在学习王爽的《汇编语言》,用masmplus写到其中一个例子时出现了这样的错误。这个错误字面上的意思结束指令end需要放在文件的末尾,但经过比较程序并无错误,于是我百度了这个错误,结果发现并没有准确的答    (有一些外网的文章有讲到,不过因为解决了就没去看,有兴趣的朋友可以去浏览一下)接下来我们来说我是怎么解决这个问题的(虽然我觉得这并不能说是解决了问题)

   从这个问题的描述来看,可以自然而然的推出是我们的code ends(这个code是什么无所谓,我当时写的是code)或者end出现了问题,因为在其它地方有类似的经过,于是我猜测是不是code这个名称让masm觉得不爽,于是我改成了codesg,结果就成功编译了;出于严谨(正好得写博客)和好奇心,我就继续测试了其它几个名称,发现都可以通过,甚至我回头重新测试了一遍code ends,还可以重新编译。

   因为错误已经解决,我也没法对它进行更多的测试,只能猜测这个错误的是masmplus本身编译时出现了一些错误,大概重新启动或者改写名字都可以解决这个问题(当然你也可以不用masmplus来搞这个)。

 

---------------------------------------------------明天继续更新---------------------------------------------------------------------------------------------------

---------------------------------------------------不知道还更不更新---------------------------------------------------------------------------------------------

(5) error A2001: immediate operand not allowed

没错,时过多日我又来更新了。

这是一个我在复习王爽老师的《汇编语言》时,跟着走一些程序时编译遇到的错误。而这个错误都在这样的一种语句上出现:

push  [3]              //push/pop [数字]

首先这个报错的字面意思是立即操作数是不被允许的。 然后我就有点懵,我好好地照着王爽老师的一点点码的啊,哪错了啊。

然后百度了一下这个错误,必须吐槽一下有很多人的解答是真的水。总归我没找到答案。

但后面我思考了一下,问题应该在于用masmplus编译的环境不同,或者说它本身编译的原理不同。

ps:这里的具体原理我也不懂,我写一下我的解决法:

因为王爽老师在书里一直是用debug来做的。或许我们可以用debug来执行?

于是我就再按书里的代码,用a命令一条条写了下去。

能写!而且能执行!

ps:在dosbox环境下,masm还是无法编译push [3]这样的东西。

 

 类似资料: