DOS的古董美
MD DocUmEnT: 3/26/2016 10:26:57 AM by Jimbowhy
当计算机技术越来越先进,越来越快速更新,作为电子FANS,发现这样的现状不仅带给从事这个行业的人更多的便利,还有更多的迷失!而DOS就像是那个本应有活力的游乐园,收集资料的过程中发现,国外确实把DOS当成了计算机世界的大游乐场!国内很多在玩开发板的的同学几乎都不懂得,其实个人电脑才是功能最齐全的“开花板”! - by Jimbowhy
1. DOS开发环境配置
计算机的快速发展可以让人不能在新的操作系统上运行旧的开发程序,但却又可以让人通过虚拟机器来运行旧的操作系统,这种事情太矛盾了,和人格分裂没什么两样。在写作的时候,怕是绝大部分机器都在使用 Windows xp 和 Windows 7 了吧,不过,至少我,还是DOS、Windows 3x/9x 还有最新的 Windows 7 上来回转,偶尔还用一下 Linux。为了可以在我的 ,不对,是微软的Windows 7上运行DOS程序,或开发程序,需要以下任意一种工具,从使用的简易度排列:
DOSBOX - for Windows 3.x/DOS
Virtual Pc
VMware Workstation
Virtual Box
Bochs - 总是记不住的开源虚拟机,还不支持文件夹共享,但可以用来模拟底层原理
即使 Windows 95 是黑白的,我也会喜欢的。
有了以上的工具,后就可以开始安装操作系统了。除DOSBOX仅支持 DOS 和 Windows 3.x 外,其它工具基本上支持各种操作系统的安装。具体安装过程序就不展开了,对于 DOSBOX,配置命令比较容易掌握,相当于使用DOS系统,用它来安装 Windows 3.x 就像在DOS安装其它程序一样。使用内置的 Mount 来映射安装目录来一个当作C盘的目录即可以运行 Windows 3.x 安装程序。DOSBOX 也可以安装Windows 95,借用Bochs的磁盘工具bximage来创建用于安装Windows95的系统盘,再用这个盘来启动就可以了。D-Fend是一个DOSBOX配置的图形界面工具,如果不熟悉DOSBOX则可以使用它来帮助配置。当然不用配置也可以直接运行 DOSBOX,像以下这条命令就可以开始无调试窗口运行,并且将 watcom 目录加载为 C 盘,同时还设置了 CPU 的模拟速度:
DOSBox.exe -noconsole -c "mount c c:\watcom" -c "config -set 'cpu cycles=10000'"
DOSBOX安装 Windows95B OSR2.1 步骤参考,安装光盘已经上传。注意imgmount命令执行方式选择很重要,不正确的参数可能导致磁盘不被识别。本机使用官方的0.74版本,系统为 Windows 7 64位。DosBox-X是不错的版本,在GitHub上有下载,还有DosBox Svn Daum 版。借用Bochs的磁盘工具bximage创建一个160MB的flat模式硬盘映像c.img,得到参数CHS=325/16/63,扇区大小使用默认的512字节,将这些参数用来设备DOSBOX的映像装载命令,如下如果第一条命令装入磁盘无法识别,可以替换第二条试试。然后,通过Windows 98引导盘来分区、格式化,最后安装系统到映像上,最后修改DOSBOX为硬盘启动。期间可能需要用到Bootice这个工具来修改引导区的信息。安装完后,进行系统可能会花屏,没有系统更新一下默认的S3显卡驱动就好了,下载地址在后面使用S3 Trio 32/64 PCI驱动。不更新驱动,直接使用16色模式也不会花屏。如果使用 DOSBox Daum,还可以加载显卡BIOS,S3 Trio 64 BIOS。
# 1. load image into dosbox IMGMOUNT 2 .\bochs\c.img -t hdd -fs none -size 512,63,16,325 IMGMOUNT c .\bochs\c.img -t hdd # 2. load floppy into dosbox and boot it IMGMOUNT a .\bochs\win98.img -t floppy boot .\vpc\win98.img -l a # 3. use fdisk to create primary partition & format it fdisk format /q /v:win95 c: # 4. mount windows cdrom or image & setup & boot windows # SMARTDRV.EXE & #13895-OEM-0000716-68627 may be useful IMGMOUNT D .\win95b_osr2.1.iso -t iso boot -l c
提示,可以用winimage工具来管理img磁盘映射,也可以用Windows系统自带的diskpart磁盘工具来加载img磁盘映射,通过计算机管理中的磁盘页面操作,或都通过命令行来实现,以下是两个脚本文件分别用来加载和卸载,保存为txt文件就可以了,使用 diskpart /s 命令来执行脚本:
REM diskpart /s mount.txt select vdisk file="c:\win3x\vpc\d3.vhd" attach vdisk REM diskpart /s unload.txt select vdisk file="c:\win3x\vpc\d3.vhd" detach vdisk
当前系统就选择了DOSBOX来运行 MSDOS 和 Windows 3.x,有了运行环境,接下来就是选择开发环境。开发工具就更加丰富了,PC世界不就是从前发展到现在的吗,前人有的东西基本都还在,没有随风飘逝。可选择就列表吧:
- Microsoft(R) C/C++, Version 7.0 - Borland(R) Delphi 1.02 - Microsoft(R) QuickC Version 2.50 - Borland(R) Pascal 7.0 - Microsoft(R) QuickC For Windows 1.0 - Borland(R) Turbo Assembler 2.0 - Microsoft(R) C Professional 6.0 - Borland(R) C++ 3.1 - Microsoft(R) Quick Basic 4.5 - Borland(R) Turbo C 2.01 - Microsoft(R) BASIC Professional 7.1 - Borland(R) Turbo C++ 3.0 - Microsoft(R) Macro Assembler 6.11 - Borland(R) Turbo C++ 3.1 For Win - Microsoft(R) Visual Basic 1.0 for DOS - DJGPP - GCC for DOS by DJ Delorie - Microsoft(R) Visual C++ 1.52c for Win3x - Open Watcom C/C++/FORTRAN Version 1.3 - Watcom C/C++ version 11.0c Update - Watcom CPP 10.0a 1994_win3x_dos ISO - Watcom C C++ 11.0b ISO - The Netwide Assembler - GNU C/C++ Compiler for DOS and Desqview X - IBM Macro Assembler 1.0 - IBM Personal Computer BASIC Compiler - IBM C Compiler for IBM PC/XT/AT computers - The High Level Assembler - GNU Assembler - GAS not for DOS
当前系统选择使用MASM,NASM等等汇编语言,还必选的 Watcom,有几个理由,它开源,它多平台,可以直接在Win32环境下运行,也可以在DOS/Win16环境下运行,它支持多语言,性能还不差。最后,它还支持 DOS 16/32-bit,WIN 16/32-bit,Linux ELF,还有其它的程序格式,在DOS32的类型上还有DOS/4GW,大内存肯定是没问题了。Watcom的历史可以追溯到1965年加拿大的学生Waterloo的团队开发了叫WATFOR的Fortran编译器,运行在IBM 7040平台,基于WSL语言。20世纪80年代后期用C重写,开始支持C,1988年推出PC版 WATCOM C++ 6.0 能够产生优于其他编译器的代码,可由于多个平台 如 DOS,Windows,OS/2 ,Windows NT。很多游戏 包括 DOOM,Descent,Duke Nukem 3D 都有它的影子,最熟悉的莫过于DOS/4GW这个工具了。
安装 Watcom 后,可以阅读 readme.txt,里面有如何配置环境变量的指导,如果使用Windows NT系列系统并且安装目录为 C:\WATCOM,则可以将以下内容保存为bat脚本,双击它就可以使用 Watcom 的各种工具了:
@echo off SET WATCOM=C:\WATCOM SET PATH=%WATCOM%\BINNT;%PATH% SET EDPATH=%WATCOM%\EDDAT SET INCLUDE=%WATCOM%\H;%WATCOM%\H\NT SET FINCLUDE=%WATCOM%\SRC\FORTRAN cmd /k
汇编选择了开源的NASM,它支持众多程序格式,同时也支持64位编程,而且语言比MASM简洁不繁俗,我认为一款好的x86汇编程序应该可以在DOS、Win32平台运行,而且可以按指定的目标平台输出编译程序。
试想这些软件热卖热卖的时候,很多人想要都得不到的吧。到现在这么旧的“破烂”,估计M$都懒得收费了吧。现在这一切都是免费的,真要把我高兴坏了。最后可以选择一个编辑器作为代码编辑工具,我选择使用 editplus,它小巧,功能齐全,支持正则,可以设置编译工具协同工作。手上还要有一款静态反汇编工具来查看程序文件。像 w32dasm 这种功能太简单,像 c32asm 这就是玩界面的货。像ida又太宏大,对于新手可能难以操控,但无论如何它是我见过最智能的反解软件,它具有图形化代码流程和详尽的系统功能注解,而且各种程序格式都可以应付,交叉平台操作,Windows平台下可以反解Linux程序,也可以其它的CPU构架如ARM。IDA的最大特色就是交互,正如其名 Interactive DisAssembly,同时它又是调试器。对于一般用途,甚至是深入的破解免费版的5.0就足已,可谓神器,OllyDBG之众与之相比,简直就是小儿科。如果想简单点,还是用 ETU-Dasm 吧,简单,因为主要用于自己的代码调试,没有涉及复杂的反解代码,所以没有必要使用太复杂的动态反编译功能,而且像 OllyDBG 这样的动态反汇编也不支持DOS程序。如果选择开源的NASM,它也有一个反汇编工具 ndisasm.exe 支持16/32/64−bit。如果你是新手,那么按以上提供的软件列表下载安装吧,开始新奇的体验吧!
VC++ 1.52与MASM命令行参数简明
1981年,微软发现了第一个汇编语言版本 Macro Assembler,中文称为宏汇编程序。在那个年代,CPU还是8086,一切都正在开始,硬件不算太复杂,指令也还不算多,程序也比较小,这个小是用kb为较量的小,所以1MB的寻址几乎就真的像当时假想的那样,足够了。早期的宏汇编程序的命令文件是 MASM.EXE,直到1991年,MASM 6.0 的发布,命令改名为 ML.EXE,而原有的命令文件 MASM.EXE 则是一个兼容驱动程序。
1999,微软发布了 MASM 6.14 补丁,ML.EXE 可作为32位控制台程序运行。这个版本中增加了对 Pentium III 的 SIMD 指令集的支持。2000年,随补丁包 Visual C++ 6.0 Processor Pack 发布的是 Macro Assembler Version 6.15.8803。现在最新的宏汇编和Visual Studio一起发行,支持更多的CPU功能特性。MASM作为微软平台上重要的开发工具之一,国外的MASM爱好者自行整理出了一个MASM32,用来在Win32环境下开发窗口程序。
在Win98ddk.exe中的 BINS_DDK.CAB 压缩包还可以找到完整的 MASM 6.11d 版本,但它提供的是增量链接程序 5.12.8181,不能用来链接16位程序。
用Microsoft的产品编写Win32程序,不管是使用VC还是MASM,都必须使用COFF (Microsoft Common Object File Format) 格式,32位的Link.exe只支持将COFF格式的obj文件链接成PE文件,另外所有的导入库等支持文件的格式也全部是COFF格式的。另外MASM汇编和C语言不同,为了使用汇编来写Win32程序,就需要一份MASM可以使用的头文件,前辈们都已经做了,MASM32安装包就有。要编译16位程序的话,就要使用 OMF (Microsoft Object Module Format) 文件格式,这种文件可以由旧式的链接程序 LINK16.EXE 支持,如MASM 6.11中自带的链接命令 link.exe,这个链接命令是段模型程序链接器 Segmented Executable Linker Version 5.31.09,比较好用的版本是1994年的5.60.339,可以在 Visual C++ 1.50中找到,也可以上MASM32官网上直接下载安装包,或者在Iczelion网站上下载都行。而 Visual Studio 97 提供的链接程序则是32位的增量链接程序 Incremental Linker Version 5.10.7303,使用COFF对象文件。
ML.EXE编译程序后会生成对象文件,它默认会调用 link.exe 命令来完成后面的链接工作,如果不想通过默认的方式生成程序,就可以指定 /c 选项只让 ML.exe 完成前期编译的工作,然后另外使用链接命令来生成程序。使用链接命令时,可以通过 /subsystem 选项来生成程序类型,如窗口程序 windows,控制台程序 console。链接DLL动态链接库时就要指定 /DLL 选项,同时还可能需要使用 /def 指定列表定义文件,或用 /base 来指定库文件加载时的默认装载地址。如果需要指定DOS兼容性代码块则可以通过选项 /stub 来指定MZ程序模块。这是一个有趣的的选项,PE文件有个简单的DOS文件头,在DOS下执行时会打印提示信息告诉用户程序要运行在Windows系统上,这部分功能称为DOS STUB,可以用完整的DOS程序来替换它,这样编译后的Win32程序就可以在DOS下使用。
ML [ /options ] filelist [ /link linkoptions ] /AT Enable tiny model (.COM file) /nologo Suppress copyright message /Bl<linker> Use alternate linker /Sa Maximize source listing /c Assemble without linking /Sc Generate timings in listing /Cp Preserve case of user identifiers /Sf Generate first pass listing /Cu Map all identifiers to upper case /Sl<width> Set line width /Cx Preserve case in publics, externs /Sn Suppress symbol-table listing /coff generate COFF format object file /Sp<length> Set page length /D<name>[=text] Define text macro /Ss<string> Set subtitle /EP Output preprocessed listing to stdout /St<string> Set title /F <hex> Set stack size (bytes) /Sx List false conditionals /Fe<file> Name executable /Ta<file> Assemble non-.ASM file /Fl[file] Generate listing /w Same as /W0 /WX /Fm[file] Generate map /WX Treat warnings as errors /Fo<file> Name object file /W<number> Set warning level /FPi Generate 80x87 emulator encoding /X Ignore INCLUDE environment path /Fr[file] Generate limited browser info /Zd Add line number debug info /FR[file] Generate full browser info /Zf Make all symbols public /G<c|d|z> Use Pascal, C, or Stdcall calls /Zi Add symbolic debug info /H<number> Set max external name length /Zm Enable MASM 5.10 compatibility /I<name> Add include path /Zp[n] Set structure alignment /link <linker options and libraries> /Zs Perform syntax check only
在使用MASM的伪指令时,还需要注意点,比如.startup这个,使用它时,在它之前的代码会统统无效,等于没写。还有 ORG 伪指令,这个家伙也会扰乱内存布局的,特别是在COM程序上,使用这个东西要多留意测试,比如下面这个COM程序骨架:
.MODEL tiny ;------------------------------------------------------------------ .STACK 256 ;------------------------------------------------------------------ .DATA ;------------------------------------------------------------------ msg db 'Hey you!', 0, '$' .CODE ;------------------------------------------------------------------ .startup jmp main org 100h _print proc ; @txt string to print ; INT 21h subfunction 9 requires '$' to terminate string push bp mov bp, sp mov ah, 9 mov dx, [bp+04h] int 21h pop bp ret _print endp main proc mov BYTE PTR[bx + 81h], '$' lea ax, msg push ax call _print inc sp ; add sp, 2 exit: ; int 21 with 4ch mov ax, 4C00h int 21h main endp end
指定开始点使用了 .startup 伪指令设置了程序入口,然后使用JMP指令跳转到main过程执行,这点逻辑上是完全没问题的。但是后面这条 org 伪指令就很有问题了,因为它会覆盖掉.startup指令设置的入口指令,导致编译后的程序代码不符合逻辑。如果直接注解 .startup 伪指令,编译后结果会更奇怪,它会生成以下这样的程序指令:
00000000 E9 09 01 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ ........ Duplications 00000100 55 8B EC B4 09 8B 56 04 CD 21 5D C3 C6 87 81 00 U.....V..!]..... 00000110 24 8D 06 20 01 50 E8 E7 FF 44 B8 00 4C CD 21 00 $.. .P...D..L.!. 00000120 48 65 79 20 79 6F 75 21 00 24 Hey you!.$
反汇编如下:
SS:0100 E90901 JMP 020C ... SS:020C C687810024 MOV BYTE PTR [BX+81H], 24 ; nothing much useful SS:0211 8D062001 LEA AX, WORD PTR [120H] ...
COM程序装入时,文件的第一个字节会装入到当前段的100H偏移处,并且由这里开始执行,即第一条指令就是跳转指令,注意文件中JMP指令的操作数是 0109,即相对JMP指令后面的109字节位置,因为这条JMP指令本身占3个字节,代码在执行时,实际跳转地址就是100+109+3=020C。这里有一条MOV指令,占5个字节,纯属无意义指令,透明处理它。接下来这条指令是要将输出字符串的地址取并压栈当函数参数传递。本来这个过程可以直接用一条PUSH指令将字符串变量的地址当立即数直接压栈的,可惜8086的指令只支持寄存器和内存地址,而不支持立即数。注意LEA指令的操作数是120H,如果这个地址是在COM程序的文件中,偏移值是对的,这个偏移刚好是字符串的所在,但是COM加载到内存执行时以100H偏移为入口,并且COM程序是没有地址重定位功能的,后面DOS程序小节涉及重定位内容,这一切最终就产生了100H的偏差,程序运行结果就出错了。
为了混用汇编和C语言进行编程,就需要配套使用微软的C/C++语言编译器,也即是 Visual C++,它的前身是 Microsoft C/C++,最高版本好像是1992年的Microsoft(R) C/C++, Version 7.0,我手上就有MSC70.zip,还有1991年发布的MSC60.zip两个版本。更早的C语言开发工具就是1990年的QuickC(R) Compiler 2.51 Professional。然后就是Visual系列的天下了,最早的一版是1992年发行的Visual C++ 1.0,20张3.5英寸磁盘装,现在能看到的只有磁盘镜像了,镜像中的Link.EX_是SZDD压缩格式。这个版本支持16位和32位开发,集成MFC框架,集成资源编辑器。链接程序为32位 Executable Linker 1.00,同时提供 link.exe 和 link32.exe 两个命令。在 Win PC World 上下载到一个称为 msvc10_32s.iso 的镜像,它包含了 msvc32s 和 msvcnt 两套开发工具,标明是 Visual C++ 1.0,但感觉不是。因为最后一个DOS开发版本是1993发行的 Visual C++ 1.52c,就是这一套工具开始,链接程序不再叫做 Executable Linker,而是叫做分段模式程序链接器 Segmented Executable Linker,随CD发行的链接程序版本为 5.60.339,这个链接程序也是MASM32中使用的16位程序链接器,C/C++编译程序为 Optimizing Compiler 8.00c,光盘镜像已经上传,可以在后面的链接找到。直到今天,它仍然具有强大的生命力,它附带的MFC可以用来开发MS-DOS程序,一些为MSDOS、Windows 3.1编写16位应用程序的程序员还在使用这个版本,它也提供了DOS开发扩展,由 Phar Lap 这家公司提供的技术,这家公司也是VCPI标准 Virtual Control Program Interface 的制订者,同时也是DPMI制订者之一。
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://hqyman.cn/post/6657.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~