学习汇编课程,卡在DOS界面!

8
我正在学习微处理器编程课程,这是我电子工程专业的一部分。不幸的是,在实验室中,我们必须使用MASM在DOS中工作。
现在,我并不觉得DOS是个问题,但我家里没有计算机安装DOS(而且我所有的计算机都没有软盘驱动器),因此我无法练习编写程序。我已经尝试在Windows下编写,但它无法汇编(我猜这是由于受保护模式的原因)。
您有什么建议吗?我应该学习在受保护模式下编程吗?那会帮助我完成课程吗?这门课程重点是8086。
也许虚拟机可以帮助?如果是这样,我从哪里获取DOS和MASM呢?

1
为了对汇编语言有一点感觉,最好集中精力学习8086。80386及以上版本(Pentium等)需要更多关于内存管理的知识,并主要使用更大尺寸的寄存器(32位或64位,而不是8位或16位)。有许多仿真器(请参见下面的答案)可用。 - Roalt
1
@Roalt:那个建议太可笑了,仅仅追求简单并不意味着要放弃实用知识。386+中包含了所有的ax bx cx dx16位寄存器,并且没有人被强制使用保护模式。在16位实模式下,现代x86处理器就足够简单了。你可以从基础开始学习,并逐渐整合其他功能。 - J. M. Becker
8个回答

8

FreeDOS是另一个选择,可以在virtualbox中运行。

http://www.freedos.org/

顺便说一下,Free DOS也可以从CD启动。如果愿意的话,我认为还可以将其安装在存储设备上。


2
我想知道DosBox会表现如何...它专为运行旧的DOS游戏而设计,但我知道我已经让它运行了一些我在'93和'94年写的非常古老的GW-BASIC程序! - Vivin Paliath

5
我建议使用虚拟机,例如免费的VirtualBoxqemu,一个x86(+其他)模拟器。我建议使用MS-DOS作为客户操作系统,因为在VirtualBox下尝试一些基本的FreeDOS汇编语言之前的尝试不可靠。

微软公司提供MASM v8的下载,但我不确定是否包含16位汇编程序。同时阅读Randall Hyde关于MASM的介绍Assembly艺术网站是学习汇编语言的好去处。当然,维基百科有一个汇编器比较页面。你需要选择一个与MASM兼容且在DOS下运行(即16位)的汇编器。

附注: 在 Windows XP 之前的旧版本 MS-Windows 中包括 MS-DOS,包括 Windows 95 和 98。如果你有或者能够找到一张旧的光盘副本,否则如果别人有的话他们可能会自愿给你 - 可以问问朋友、当地电脑店或家人,你应该可以很轻松地在虚拟机中安装它们。

3

我建议使用 Sun 公司的VirtualBox (免费),在任何平台上(如Windows、Mac和Linux等)运行一个DOS虚拟机。


2

我曾经使用过这个模拟器bochs,搭配免费的dos系统,如果你只需要基本的dos功能,它非常不错。


“qemu”通常取代了“bochs”,它也具有成熟的虚拟化支持。 - J. M. Becker

1
一个虚拟机就可以了。如果你的学术机构提供访问权限,我相信 DOS 在 MSDNAA 上是免费的。如果你使用的是 Windows,我建议使用 Microsoft Virtual PC 来运行 DOS 虚拟机。尽管我个人更喜欢 VMware 作为虚拟机主机,但就 DOS 而言,Virtual PC 似乎在仿真方面做得更好一些。

我并没有真正尝试过FreeDOS,也无法对其兼容性做出评论。我非常怀疑它能够完全兼容所有MS-DOS存在的漏洞。任何软件都能达到100%的兼容性几乎是不可能的。 - Mehrdad Afshari
1
FreeDOS具有出色的兼容性。我不会期望很多人会发现导致实际问题的差异。 - Brian Knoblauch
如果是这样,它也应该能够工作。获取实际的MSDOS也不应该很难。无论如何,VM是正确的选择。NTVDM绝对不是。 - Mehrdad Afshari
通常情况下,我能够在FreeDOS中运行所有东西,没有太多问题。MSDOS确实包含一些特殊性,如果有人专门为它们编码可能会出现问题。因此,如果你遵循“合理”的编码规范,应该就没问题了。 - J. M. Becker

0

Inline::ASM - 用汇编语言编写 Perl 子程序。

概要

   print "9 + 16 = ", add(9, 16), "\n";
   print "9 - 16 = ", subtract(9, 16), "\n";

   use Inline ASM => 'DATA', 
              AS => 'as',
              PROTO => {add => 'int(int,int)'};

   use Inline ASM => 'DATA',
              AS => 'nasm',
              ASFLAGS => '-f elf',
              PROTO => {subtract => 'int(int,int)'};

   __END__
   __ASM__

   .text
   .globl    add

   add:      movl 4(%esp),%eax
             addl 8(%esp),%eax
             ret
   __ASM__
             GLOBAL subtract
             SECTION .text

   subtract: mov eax,[esp+4]
             sub eax,[esp+8]
             ret

0
如果您在“开始”菜单中键入COMMMAND而不是CMD,并选择运行,您将进入DOS。

使用这些链接,您将获得有关如何入门的提示。http://website.masm32.com/ 和 http://www.microsoft.com/downloads/details.aspx?FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64&displaylang=en - Keith Adler
1
我强烈建议不要为了学习而这样做。在虚拟8086模式下运行存在许多怪异之处,可能会误导学习者,特别是在汇编语言层面上 - 而且它在x64上也不可用。 - Mehrdad Afshari
2
我同意Mahrdad Afshari的观点,这并没有提供16位环境,而masm32是为32位(保护模式)环境设计的,这与Saad在学校的指导非常不同。 - mctylr
如果您正在运行64位Windows 7,则可以下载Windows XP模式,这将允许您执行它。 我不反对使用虚拟机,但如果必须要用的话,Sun VirtualBox与FreeDos会是我的选择。http://www.freedos.org/ - Keith Adler
它们并不相同。COMMAND是Windows 16位模拟器,而CMD是Windows XP命令行壳。无论你在哪个环境下,你都不能直接访问硬件(除了一些罕见的带有签名驱动程序的情况),因为内核会将其抽象化。这在任何高于Windows Me的Windows版本中都是如此。 - Keith Adler
显示剩余2条评论

0

VMWare就可以了。只需找到DOS映像(.iso或软盘)并在VMWare上安装即可。您可以随意使用它,而不会对主机机器造成任何伤害。如果您想的话,甚至可以玩int13中断 ;) 哦,我很怀念在我的i386上钩住DOS下的中断子程序的“常驻”应用程序的时光 :)

祝好运,享受汇编吧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接