win10 64位下搭载汇编环境:https://blog.csdn.net/xyisv/article/details/69062382

上古软件仓:https://skywind.me/wiki/上古软件仓
DOS 经典游戏合集:https://skywind.me/blog/archives/2869
怀旧网络资源:https://skywind.me/wiki/怀旧网络资源

1、关于 dos 系统

MS-DOS 是什么?它是否仍在使用?与 Windows 系统有何不同?:https://blog.csdn.net/winkexin/article/details/131468967

什么是 dos 系统

"硬盘操作系统 (Disk Operating System 简称 DOS)" 是早期个人计算机上的一类操作系统。家族成员包括 86-DOS、MS-DOS、PC-DOS、DR-DOS、FreeDOS、PTS-DOS、ROM-DOS、JM-OS 等,这些系统常被简称为 "DOS(磁盘操作系统)",其中以 MS-DOS ( Microsoft Disk Operating System 的缩写) 最为著名。dos 是用于从磁盘(硬盘驱动器或软盘驱动器)运行软件和管理设备(例如格式化)的工具和命令的集合。

PC-DOS 和 MS-DOS

Windows 之前:PC-DOS 和 MS-DOS

当 IBM 开发第一台个人计算机时,它需要一个磁盘操作系统。 为此,它求助于微软开发 PC-DOS。
许多旧 PC 启动时会在 POST 屏幕上显示 PC-DOS 字样。 但随着时间的推移,情况发生了变化,因为 IBM 不再是唯一的 PC 生产商。
Columbia Data Products 能够对 PC 的 BIOS 进行逆向工程,Compaq 紧随其后。 一旦发生这种情况,任何制造商都可以开发自己的 BIOS。 微软利用这一点,向 IBM 在 PC 市场的竞争对手发布了 MS-DOS。
所以,PC-DOS 和 MS-DOS 都是微软出品的。 随着 IBM 在 PC 市场(它本质上创造的)份额的缩小,PC-DOS 的使用也在缩小。

MS-DOS 和 Windows

MS-DOS 让微软在早期的 PC 行业站稳了脚跟。 虽然它已经为 MSX 和 Commodore 生产了磁盘操作系统,但它将商业计算行业确定为一个增长目标。
微软已经发布了用于 MS-DOS 的办公工具,并于 1987 年发布了 Windows 1.0。 Windows 的第一个版本为 PC 带来了 GUI 环境,这在 Apple 和 Amiga 计算机上已经有好几年了。
随着 Windows 随着每个版本的发展而增长,MS-DOS 的使用率下降。 当 Windows 95 出现时(在包含 Web 浏览器的推动下)它是 MS-DOS 终结的开始。 PC 不再启动进入 MS-DOS; 相反,它启动进入 Windows。
Windows 95 和 Windows 98 保留了可以从 GUI 切换到的 MS-DOS 模式。 这适用于旧软件和现代游戏,其中许多是在没有 Windows 支持的情况下发布的。

MS-DOS 提示符 演变成 命令提示符

Windows 命令提示符用于和 Windows PC 进行命令行交互。(按 WIN+R 然后输入 cmd )。它的出现要归功于 MS-DOS 的后期; Windows 95 和 98 可以切换到 MS-DOS 模式,或者通过命令提示符访问它。当时它被称为 MS-DOS 提示符。不过 MS-DOS 最终从 Windows 中剥离,但是命令提示符却得以保留,现在命令提示符已经被 Windows PowerShell 取代。

2、汇编 编译器

编译器 用来把 源代码 编译成 机器码。

  • MASM:微软经典产品,仅支持 Windows 平台,唯一完美支持按需编译的编译器,不支持输出 bin 格式。非绿色软件,受版权限制不能二次发行(SASM二次发行了多个汇编编译器唯独没有MASM)。
  • NASM:一直在持续更新的经典产品,跨平台,支持多种输出格式(bin/coff/omf/elf/…)。有不少衍生品如 YASM,可那些衍生品还不如本尊 NASM 命长。
  • FASM:还在更新,跨平台,支持多种输出格式(包括bin)。作者在汇编GUI领域走的非常远(参见Fresh IDE及其freshlib),我个人感觉有点偏离汇编正途,用力用错了方向,嘿嘿(我用C++/QT写GUI都嫌麻烦更不要说汇编)。
  • GoASM:仅支持 Windows 平台,不支持输出 bin 格式。作者很有想法,做了大量工作简化Windows应用开发。缺点是加入太多自己的东西,有绑架用户的嫌疑,不利于编写可移植代码。JMP label生成长跳转(E9)而不是短跳转(EB)让我挺无语(见下文代码,其文档中视之为unique label)。

跨平台的优选 NASM,次选 FASM。
Windows平台优选 MASM,次选 GoASM。

Microsoft 的 MASM 编译器

微软出品的汇编工具 MASM:Microsoft 汇编程序(俗称MASM)是一种工业软件开发工具,已经由主要的操作系统供应商维护和更新了30多年。它从未被软化或折衷为对消费者友好的工具,并且被设计为供专业程序员用于操作系统级代码和高性能目标模块,可执行文件和动态链接库。

可以下载 MASM5.0 工具压缩包,里面包含必要的汇编、链接、调试工具。( 注意:MASM 路径 不要有中文和空格 )

  • masm.exe:宏汇编程序,用来将汇编源程序(.asm)进行汇编,得到目标程序(.obj)
  • link.exe:连接程序,将目标文件(.OBJ)、库文件(.LIB)连接生成可执行文件(.EXE)
  • cref.exe:交叉引用程序,处理符号交叉引用文件(.CRF),生成符号交叉列表文件(.REF)
  • lib.exe:库管理程序,用以建立子程序库
  • debug.exe:调试程序,用以代码调试
  • td.exe:调试工程,用于代码调试,推荐使用这个
  • edit.exe、edit.com、edlin.com:DOS环境下的代码编辑软件
  • hello.asm :个人写的输出 HELLO WORLD 的代码
  • hello.exe:编译生成的可执行文件

如果不想下载则可以安装 masm for windows(下载:https://www.onlinedown.net/soft/43311.htm ) 来获取 MASM。官网:http://www.jiaminsoft.com/#MASM

安装后可以看到有 3 个版本:masm5.0、masm6.0、masm6.15

masm for windows 是一个友好的文本编辑器,通过调用 dosbox 来运行和调试 汇编程序。软件自带好多关于汇编的教程和资料。学习汇编必备!!!

切换 编译器:单击功能区 "设置" 按钮进行设置(切记选择与自己编写程序相对应的《或与教村一致)编译器)。"资源导航窗口":双击导航栏中相对应的资源即可打开资源。右键有“对练”资源的程序,方便进行对照练习。

Masm for windows 集成实验环境中怎么没有debug调试?需要使用 Visual Studio 2010/2012或者使用MASM32,MASM32不是单纯的工具包,而是一个集成开发环境,使用的是微软官方的工具包。

MASM for x64 (ml64.exe)

微软官网文档:https://learn.microsoft.com/zh-cn/cpp/assembler/masm/masm-for-x64-ml64-exe?view=msvc-170

https://github.com/MicrosoftDocs/cpp-docs/blob/main/docs/assembler/masm/masm-for-x64-ml64-exe.md

Visual Studio 包括 32 位和 64 位托管版本的 MASM(Microsoft 宏汇编程序),面向 x64 代码。 它的名称为 ml64.exe,是接受 x64 汇编程序语言的汇编程序。 当你在 Visual Studio 安装期间选择 C++ 工作负荷时,会安装 MASM 命令行工具。 MASM 工具不可单独下载。 有关如何下载并安装 Visual Studio 副本的说明,请参阅安装 Visual Studio。 如果只需要命令行工具,而不需要完整的 IDE,请下载 Visual Studio 生成工具

若要在命令行上使用 ml64.exe,请启动适用于 x64 目标的开发人员命令提示符。 开发人员命令提示符会设置所需的路径和其他环境变量。 若要了解如何启动开发人员命令提示符,请参阅在命令行上生成 C/C++ 代码

有关 ml64.exe 命令行选项的信息,请参阅 ML 和 ML64 命令行参考

x64 或 ARM64 目标不支持内联汇编程序,也不支持使用 ASM 关键字。 若要将使用内联汇编程序的 x86 代码移植到 x64 或 ARM64,可以将代码转换为 C++、使用编译器内部函数或创建汇编程序语言源文件。 Microsoft C++ 编译器支持内部函数,允许你以尽可能接近跨平台方式的方式使用特殊函数指令,例如特权、位扫描或测试、互锁等。 有关可用内部函数的信息,请参阅编译器内部函数

任意使用一个文本编辑器,输入以下代码,并保存为 hello_asm.asm

includelib kernel32.lib

    extrn __imp_GetStdHandle:proc
    extrn __imp_WriteFile:proc
    
    .CODE
hwStr byte "Hello World!"
hwLen = $-hwStr

main PROC
    lea rbx, hwStr
    sub rsp, 8
    mov rdi, rsp
    sub rsp, 030h
    mov rcx, -11
    call qword ptr __imp_GetStdHandle
    mov qword ptr [rsp + 4 * 8],0
    mov r9, rdi
    mov r8d, hwLen
    lea rdx, hwStr
    mov rcx, rax
    call qword ptr __imp_WriteFile
    add rsp, 38h
    ret
main ENDP
    END

执行命令编译链接:ml64 hello_asm.asm /link /subsystem:console /entry:main

  • ml64 hello_asm.asm 表示编译 hello_asm.asm 文件
  • /link /subsystem:console 表示自动链接系统控制台输出功能
  • /entry:main表示程序入口是 main

执行编译好的程序,成功输出 Hello World

MASM32 SDK

MASM32 不是单纯的工具包,而是一个集成开发环境,使用的是微软官方的工具包。

MASM32 SDK ( 简称 MASM32 ) 是一个独立的项目,并不是 Microsoft 的 MASM 汇编器。是国外的 MASM 爱好者 Steve Hutchesson 自行整理和编写的一个软件包,目前最高版本为11r版,包含了不同版本工具组建的汇编开发工具包。它的汇编编译器是 MASM6.0 以上版本中的 Ml.exe,资源编译器是 Microsoft Visual Studio中的Rc.exe,32位链接器是Microsoft Visual Studio中的Link.exe,同时包含有其他的一些如 Lib.exe 和 DumpPe.exe 等工具。官网:https://masm32.com/

下载后,解压,然后点击 install

masm32的下载、安装、使用:https://blog.csdn.net/2301_77946674/article/details/142720613

选择安装路径,因为文件较小,所以选择放在c盘中。然后弹出的界面都点击确定。当出现如图

说明初始化已经成功。点击 关闭窗口,然后再一路点击确定。安装结束后,可直接利用masm32v11r 中的 gedit.exe 程序编写、编译和链接 asm 汇编程序。

MASM32 的替代方案:可直接从其他电脑或从上述网盘地址提供的压缩包将汇编工具DEBUG.EXE、EDIT.EXE、LINK.EXE、MASM.EXE 等工具复制到 D:\DEBUG 文件夹下(复制时注意不能将32位系统中找到的上述工具复制到64位系统中使用)。

3、模拟 dos 系统

汇编语言,做实验是必不可少的,但是由于汇编语言本身的缺陷,现代计算机并不能直接运行汇编语言程序,因此

  • 使用虚拟机:VMware/VirtualBox ---> 安装XP系统
  • 或者安装 DOSBox。DOSBox 可以模拟 MS-DOS 环境。 使用 DOSBox 可以在现代 PC 上运行旧软件(即 1981 年至 2001 年间发布的 MS-DOS 游戏)。虽然 DOSBox 项目最初旨在运行所有 DOS 软件,但它主要用于游戏。 许多出色的应用程序和游戏都可以运行在 MS-DOS(无论是使用开源版本、DOSBox 还是 FreeDOS) 及其变体的系统。

微软在 GitHub 上发布了 1.25 和 2.0 版本,专门 “供参考”。 它被列为已采用 Microsoft 开放源代码行为准则。 这是一个重要的发展,因为微软历来是封闭源代码的代表。但请注意这是早期版本。 MS-DOS 的最新版本是 Windows Me 上的 8.0。

dosbox (已停止更新)

dosbox 是一个 DOS 系统模拟程序,支持在 Windows、Linux、Mac OS X、BeOS 、palmOS、Android 、webOS、os/2等系统中运行。不少DOS下的游戏都可以直接在该平台上运行。dosbox 目前项目已经停更。下载地址:https://www.dosbox.com/download.php?main=1

安装时全部默认即可,桌面会创建快捷方式。

安装完成,打开后会弹两个窗口,注意这两个关掉任何一个,程序立即退出

下一步,挂载自己的汇编工具包,我这里创建了两个文件夹

  1. 一个用来保存汇编工具,如:D:\huibian\masm 。将汇编工具 放到新建的工作目录下。( 实际会用到的有以下程序:debug.exe   edit.com   link.exe   masm.exe )
  2. 一个用来保存汇编源文件( 如:D:\huibian\debug )。

打开 DOSBOX 的安装根目录(默认安装路径:C:\Program Files\DOSBox-0.74;若是64位的系统,则默认安装路径:C:\Program Files (x86)\DOSBox-0.74),双击文件 DOSBox 0.74 Options.bat,运行该批处理文件后系统会用文本文档Notepad打开配置文件dosbox-0.74.conf (如果双击没反应,直接命令行执行),将光标定位到 dosbox-0.74.conf 文件的 [autoexec] 节点(一般在该文件末尾),在文件中添加以下内容:

MOUNT C D:\huibian               # 将 目录 D:\huibian 挂载为 DOSBOX 下的 C:
set PATH=$PATH$;C:\masm          # 将 映射后 C:\masm 写入环境变量 PATH 中
# 环境变量添加 c:\masm,这样就可以调用 d:\huibian\masm\下的编译工具;
# 注意:不能设置成 set path=%path%;d:\masm\,因为此时 d盘 已挂载到 c盘 上
C:                               # 进入 dosbox 系统 的 C 盘

mount 的作用是将 pc的目录 映射到 dos系统的目录。这里是将我电脑中 D:\huibian 映射到了 dos 系统 c 盘,这样你对 dos 的c盘的操作就相当于是对 D:\huibian 的操作。其实也可以不修改 conf 文件,只要在每次运行时输入这两个命令就行了。保存文件后关闭。

dosbox 的 conf 文件的 [autoexec]标签 下面的代码会在 dosbox 启动时运行,这样就不用在 dosbox 中每次输入代码了。

更改窗口大小。

方法 1:确定要改的文件 “C:\Users\计算机名\AppData\Local\DOSBox\dosbox-0.74.conf”,而不是“C:\Program Files (x86)\DOSBox-0.74\DOSBox 0.74 Options.bat”;

windowresolution=1280x720
output=opengl

方法 2:https://tieba.baidu.com/p/2150370425?red_tag=0020431408

找个区段,添加以下代码
[sdl]
fullscreen=false
fulldouble=false
fullresolution=original
windowresolution=1280x720
output=opengl
autolock=true
sensitivity=100
waittrue
priority=higher,normal
mapperfile=mapper-0.74.map
usescancodes=true

[render]

frameskip=0
aspect=false
scaler=normal2x

可以在 windowresolution 里调你想要的分辨率

安装结束后,可直接利用 masm32v11r 中的 gedit.exe 程序编写、编译 和 链接 asm 汇编程序。

dosbox-x ( 推荐 )

dosbox-x 官网:https://dosbox-x.com/
github:https://github.com/joncampbell123/dosbox-x

DOSBox-X 是一个知名的DOS+PC98模拟器。它的代码原本基于DOSBox和DOSBox SVN Daum,但是经过多年发展有了很多独特的功能。其中它对中文、日文等双字节语言的完善支持是一个较典型的例子,而原本DOSBox和DOSBox SVN Daum等其它分支尚不具备。dosbox-x 为用户提供了一个在现代环境中重温经典 DOS 应用和游戏的有效工具。

DOSBox-X 软件特点

  • 支持创建和使用最大容量是 4G(官方版支持的最大容量是 504M)的硬盘映像。
  • 支持通过配置来设置中文汉化,运行 GHPZ 批处理文件可更换其它类型中文菜单(更换后的 CONFIG 中文菜单其内容可能不全,需要自己补充)。
  • DOSBOX 运行后单一窗口显示(DOSBOX 正常情况下是显示两个窗口)。

从 github 下载 DOSBox-X 解压即可使用。

DOSBox-X 中文语言支持功能图文说明:https://www.cn-dos.net/dosware/dosbox-x-zh.html

如果运行安装程序时未选择中文语言,也可以手工修改DOSBox-X所在文件夹下的dosbox-x.conf文件以设定中文代码页和界面语言。

修改 dosbox-x.conf

找到 country = 这行改为 country = 86,936(简体)或 country = 886,950(繁体)

再找到 language = 这行改为 language = zh_CN(简体)或 language = zh_TW(繁体)

重启 DOSBox-X 就会切换到中文代码页和界面语言。

开启长文件和目录名功能

如果在安装程序选择报告的DOS版本时选择了7.10的话,DOSBox-X将开启长文件和目录名功能,这样DIR命令将同屏显示长短文件和目录名,其中短文件/目录名即标准8.3格式(8个字符主文件名加3个字符扩展名)的文件/目录名,而长文件/目录名也即Windows系统中的原始文件/目录名,这样用户将很容易看出短文件和目录名分别对应Windows系统中的哪些文件和目录名。其它DOS命令(如TYPE等)和文件名自动完成功能(按TAB键)亦可以同时操作于两者。如果用户没有在安装时选择7.10版本的话,可以打开DOSBox-X所在文件夹下的dosbox-x.conf文件,找到 ver =  这一行并将其改为 ver = 7.1 这样再次启动DOSBox-X时亦将启用长文件名支持。

DOSBox-X在中文代码页下能够直接显示中文文件内容(Unicode或非Unicode),比如网上下载的中文游戏攻略、中文小说或其它文字,可以直接用TYPE或MORE命令查看GB/Big5编码的中文文件,无需任何第三方组件。简体中文代码页可以显示GB编码的文件,繁体中文代码页下可以显示Big5编码的文件。建议使用 MORE 命令来查看文件内容,比如 “MORE 中文文件名.TXT”,以分屏显示文件内容,如下图所示的UCDOS98使用说明。如果是 Unicode(UTF-8或UTF-16)格式的中文文件的话,可以分别用UTF8或UTF16命令来查看它们,比如
UTF8<UTF8中文文件.TXT | MORE
命令将分屏显示"UTF8中文文件.TXT"(假设该文件为UTF-8格式)中的内容,而
UTF16<UTF16中文文件.TXT | MORE
命令将分屏显示"UTF16中文文件.TXT"(假设该文件为UTF-16 LE或BE格式)中的内容。

DOSBox-X在中文代码页下可直接运行中文DOS程序并显示中文,而不需要另外挂载汉字系统。有些程序可能需要指定命令行参数以强制以中文显示。

DOSBox-X不仅支持显示中文,亦可以输入和打印中文。在中文代码页下用户可以用Windows系统所支持的任何中文输入法直接在DOSBox-X中输入中文,跟其它Windows程序(比如记事本)中输入中文是一样的。

动态切换代码页和界面语言

  • DOSBox-X允许用户在dosbox-x.conf文件中更改代码页和界面语言,亦允许运行时动态切换代码页和界面语言。举个例子用户有可能想先执行一个简体中文DOS程序,然后再执行一个繁体中文DOS程序,这样就需要不同的代码页以支持它们。切换代码页和界面语言均可以用CHCP命令进行,比如 CHCP 936 命令将切换到简体中文代码页936,而 CHCP 950 命令将切换到繁体中文代码页950。亦可以切换到其它语言代码页,如437为英文代码页、932为日文代码页等。
  • 不过以上这些命令仅切换代码页,而代码页如果和界面语言不匹配的话可能会造成乱码,所以用户很可能更希望同时切换两者,方法也很简单,对于已有的界面语言包括中文来说,在CHCP和代码页的后面加上一个冒号(:)即可,比如 CHCP 950: 命令将同时切换到繁体中文代码页和界面语言,这样就不会出现代码页和界面语言不匹配的现象,此操作亦可通过菜单进行,在“主菜单”中点“加载语言文件”,然后选择想要的语言文件(如简体中文为zh_CN.lng、繁体中文为zh_TW.lng、日文为ja_JP.lng、英文为en_US.lng等)即可。

DOSBox-X 默认状态下与纯DOS下类似,简体中文代码页936下默认使用 GB2312 字符集,繁体中文代码页950下默认使用 Big5-1984 字符集。如果需要的话可以开启大字符集支持,比如简体中文代码页下可以使用 GBK 字符集、在 dosbox-x.conf 中找到 gbk = false 并将其改为 gbk = true
即可启用 GBK 字符集支持,这样的话如果系统中的中文文件或目录中有繁体字(或部分日文汉字)等亦可以正常显示,亦可以显示含 GBK 字集的文件内容。

如果用的是繁体中文代码页的话,可根据需要启用中国海字集、香港增补字符集或Unicode补完计画字符集支持,这些补充字集支持一些原本Big5-1984字集中不包含的字(比如堃、煊等)。启用中国海字集的方法是,在 dosbox-x.conf 中找到 chinasea = false 将其改为 chinasea = true 这样某些程序(比如汉书5.03版)将可以正确显示一些特殊符号。

如果想启用香港增补字符集或Unicode补完计画则均需将代码页设为951,后者同时需将 dosbox-x.conf 中的 uao = false 改为 uao = true 后启动 DOSBox-X 即可生效(951代码页下)。这些操作均可在命令行下进行,例如config -set gbk=true命令将开启GBK字符集支持、config -set uao=true命令将开启Unicode补完计画字符集支持等。

DOSBox-X亦允许用户使用不同的字体来显示中文字符,而不光是默认的中文字体。如果是用的TTF输出(即output=ttf),默认是用的更纱黑体TTF字体(SarasaGothicFixed.ttf),用户亦可改用其它的TTF/TTC或OTF字体,比如楷体、黑体、宋体等,或者使用诸如华康系列的TTF/OTF字体(如下图分别使用华康POP字体和华康娃娃体在简体中文和繁体中文代码页下显示DIR命令的帮助信息)。在dosbox-x.conf中找到font = 选项进行设置即可,亦可在命令行下动态切换字体,比如
config -set font=simkai

命令将立即切换到楷体。如果是用的非TTF输出(比如direct3d或opengl类型的输出)的话,DOSBox-X默认从Windows系统中获取字体,或者使用自带的wqy_12pt.bdf(16点阵)、wqy_11pt.bdf(14点阵)中的字体,而用户亦可改用其它点阵字体,比如简体中文用户可在dosbox-x.conf的[dosv]栏中设置fontxdbcs = hzk16以使用UCDOS的HZK16点阵字体,而繁体中文用户可设置fontxdbcs = stdfont.15以使用倚天中文的STDFONT.15点阵字体,亦可使用bdf或pcf格式的点阵字体,只需将相应的点阵字体文件复制到DOSBox-X所在的文件夹下即可(或者在fontxdbcs选项中指定字体文件所在的完整路径加文件名)。

DOSBox-X的中文功能具有较强的制表符自动识别能力,以解决可能的制表符号显示问题。虽然它通常情况下不会有什么问题,但特殊情况下可将它关闭,方法是在dosbox-x.conf中找到autoboxdraw = true将其改为autoboxdraw = false。不过用户可能更希望在特定情况下将该功能动态开启或关闭, 在命令行下输入config -set autoboxdraw = false即可将制表符自动识别功能暂时关闭,再输入config -set autoboxdraw = true即可恢复。DOSBox-X亦支持中文DOS/V功能,不过和标准的中文DOS模式相比中文DOS/V模式与普通DOS程序的兼容性较差,所以不推荐使用(即保持dosbox-x.conf中设置dosv = off)。

DOSBox-X的文字复制和粘贴功能在中文代码页下亦支持中文字符的复制和粘贴,与英文模式下的英文字符复制和粘贴功能差不多,用户默认情况下可按住SHIFT键然后用鼠标右键来选择要复制的文字,放开鼠标右键后即复制成功。此时可将文字粘贴到其它Windows程序中。如果用户已在其它Windows程序中复制一段文字,切换回DOSBox-X后可在按住SHIFT键的同时按一下鼠标右键,复制的文字将粘贴到DOSBox-X窗口中。用户亦可通过CLIP$这样的特殊设备来实现文字的复制和粘贴,在确保“主菜单”中的“剪贴板功能”中的“启用 DOS 剪贴板设备存取”已选中的情况下(或在dosbox-x.conf中设置dos clipboard device enable = true开启),比如输入COPY/? >CLIP$命令会将COPY /?命令的执行显示结果复制到剪贴板中(CLIP$所代表的设备),用TYPE CLIP$命令即可将剪贴板中的内容显示出来,

更改 窗口大小 同 dosbox。。。

4、集成开发环境 (IDE)

使用 文本形式 编写汇编代码太麻烦,可以使用 集成开发环境(IDE)汇编 IDE :radasmMasmPlus、Easy Code、Visual Studio、Emu8086、ASM-Tool 等。使用比较多的就是 radasmMasmPlus、Visual Studio。

emu8086 可以直接编译、运行、调试,不需要dosbox。

vs code 配置 MASM32

参考:https://zhuanlan.zhihu.com/p/105268949

VScode 配置 MASM32 运行环境(断点/运行/debug/配合emu8086(非DOSBox))。之所以不用DOSBox,是因为不利于集成到 VScode,执行代码需要新开窗口,配置繁琐。ps:而且加断点和调试复杂。感谢 masm-code 插件的作者,终于可以补全啦

1.安装VScode
2.安装 masm-code, code runner插件
3.下载masm32 sdk 解压,然后安装,一路yes就可以了。
4.从 GitHub 下载 ms-dos player:https://github.com/cracyc/msdos-player 编译安装
5.解压里面的 msdos 到 c:\Program Files (x86),X为想安装到的盘符。然后 添加环境变量

使用 RadASM

官网:http://assembly.com.br/

RadASM的安装和使用说明:https://blog.csdn.net/weixin_42929607/article/details/105081313
RadASM原版下载、汉化、配置、解决中文乱码 傻瓜式教程:https://blog.csdn.net/2301_79113923/article/details/135665466

RadASM 有内置的语言包,可以直接设置中文界面。注意:安装路径最好没有中文

把这三个下载之后,先解压 IDE  再解压 语言包 语言包要放在安装包目录下面

弄好后点击 RadASM.exe 启动RadASM,然后:菜单栏 ---> Option ---> Language ---> 简体中文 (两个都可以),点击 Apply再点击 OK就可以设置成中文界面了。

与 RadASM 同级别的 IDE 还有 MASMPlus,这里不在介绍。有兴趣自己搜索。。。

Visual Studio

Visual Studio 编写并执行汇编代码:https://blog.csdn.net/weixin_43272781/article/details/104988520

查看C语言代码对应的32位x86汇编语言

在VS编译器中,创建项目,敲一段C语言代码

#include <stdio.h>
#include <Windows.h>


int main() {
	short a = 32;
	int i = 19;
	int *p = &i;
	
	system("pause");
	return 0;
}

在程序结束前,设置断点(按F9),按 F5 进入程序调试模式

查看汇编指令:点击【调试】–>【窗口】–>【反汇编】就可以查看汇编指令。

查看寄存器。同样的,在【反汇编】下面,点开【寄存器】

打开寄存器后,在该窗口【右键】,可以设置显示情况。

查看 内存

这里的内存1,2,3,4,他们的地址范围不一样,例如:

  • 内存1对应地址:0~10、
  • 内存2对应地址:11~20
  • 内存3:21~30

根据地址情况,使用不同的内存即可,只是方便你查看,分开了一下,没别的含义。

推荐设置。这些是汇编语言常用的操作,当然,还建议打开【局部变量】,以下是我的窗口设置

单步调试。注意窗口的选择

  • 如果单步执行源代码的下一步,就选中【源程序】窗口
  • 如果单步执行汇编代码,就选中【反汇编】窗口

5、"编辑、调试" 汇编程序

编辑 源程序(asm)

有 两种方法 编辑 汇编源程序:

  1. 新建 文本文件,修改 文件名 和 文件扩展名 为 test.asm,将 test.asm 放到 D:\huibian\debug 文件夹。
  2. 也可以运行 DOSBOX,在命令符 C:\DEBUG> 下输入命令:edit test.asm,启动 EDIT.EXE 进入代码编辑状态。使用 edit 命令进去后光标会消失,此时调用任务管理器 alt+ctrl+del 即可释放光标。

如果感觉窗口太小,字体太小,可以按 alt+enter 切换到全屏模式。同时在配置文件的第26行有一行字符 “fullresolution=original”,这是用来调节DOS窗口全屏下的分辨率的,默认 original 的值是640x480(中间是小写x),可以将 original 改为 800x600 就比较舒服。

;完整段的 Hello World 程序
DATAS  SEGMENT
     STRING  DB  'Hello World!',13,10,'$'
DATAS  ENDS

CODES  SEGMENT
     ASSUME    CS:CODES,DS:DATAS
START:
     MOV  AX,DATAS
     MOV  DS,AX
     LEA  DX,STRING
     MOV  AH,9
     INT  21H
   
     MOV  AH,4CH
     INT  21H
CODES  ENDS
    END   START

汇编源代码 到 机器码

打开 dosbox,输入命令:masm,然后输入汇编源文件名,其他都默认即可。

命令执行完后会生成目标文件文件名 .OBJ(生成过程中可以修改目标文件名,直接回车可保持默认目标文件名)。注意:此时可能生成三个文件:*.obj、*.lst 和 *.crf 文件( Windows10 x64系统只会生成*.obj文件 )。其中,列表文件*.lst和交叉引用文件非必选,前者是汇编语言汇编的机器语言与汇编语言对照表,可用于调试;后者给出了用户定义的所有符号和对每个符号定义、引用的行号。

连接 obj

先输入link,再输入文件名,之后一直回车。

LINK 文件名.OBJ,链接生成可执行文件文件名.EXE。

注意:由于在上述代码中未定义堆栈段,故在链接时会提示:LINK : warning L4021: no stack segment,因不会影响执行文件的生成,故暂时忽略。另外,此时可能生成两个文件:*.exe和*.map文件(Windows10 x64系统可能只会生成*.exe文件)。其中,地址映射文件*.map给出内存地址分配的有关信息。

运行 exe

直接运行生成的 exe 程序

调试 exe ( 推荐 td )

debug.exe

debug.exe 是 dos 系统下的程序,debug 两种状态 ( 两者之间切换用shift )

  • 接收debug命令的状态
  • 命令下的相关操作状态

用法:debug 文件名.exe 

确定与退出都按回车键
建议初学者不要对CS、IP、SS、SP中的内容进行修改
"-"为 debug的提示符,提示符后面可以输入命令。输入 ? 查看所有命令
89D8 H = MOV AX,BX
修改一个按回车,修改多个按空格
HLT:暂停,涉及到硬件处理

输入 ? 查看都有啥指令

一共才二十来个指令,而常用指令有才6个

A 命令:逐步 汇编(assemble)。以汇编的形式在内存中输入一条机器指令。注意:起始的偏移地址一定为 0100。用法:A [adress]
1.不给地址的话,默认为0101或者当前的IP地址
2.从给定地址adress开始输入汇编语句,把语句汇编成机器代码依次存放在给定地址开始的存储器

  • 用 A命令分别把0001,0002送到AX,BX中,再AX = AX + BX
  • 再 用 D命令 显示相应内存的内容
  • 用 U命令 反编译,把机器代码翻译为汇编语句。反汇编,即把机器指令翻译成字节码显示

R 命令: read && write register 显示和修改寄存器。修改寄存器:-R 寄存器名称

U 命令: 反汇编 (unssemble ),把机器代码反汇编显示:-U [地址]

  • 若省略地址,从上一个U命令的最后一个指令的下一个单元开始显示32个字节。
  • 若只给起始地址,只对20H个字节的机器代码反汇编显示
  • 若给定始末地址,对指定地址的机器代码反汇编显示

D 命令: dump (转储、显示),以十六进制显示内存区域的内容,-D [地址或范围]

  • 若未给出范围,默认显示上一个D命令之后 128 字节存储单元。从左至右依次是:段地址:偏移地址 以十六进制的形式显示内存值   以ASCII码的形式显示内存值其中 物理地址=段地址 × 16D + 偏移地址,16D也就是左移四位
  • 若给出一个特定地址,则显示对应的存储单元的内容
  • 若给定一个查看范围,则显示范围内的储存单元们的内容
  • 若给定起点和长度,则从起点开始显示 指定长度的内容。-D [起点] [L长度]

E 命令: 改变内存单元的内容。enter,-E 地址 [内容]。

  • 若只给出地址,可改变对应地址开始的连续的一个至八个字节。如:E DS:0100,输入空格可逐个字节修改,回车停止修改。
  • 若给出地址以及一个或多个数据,可连续修改内存中的内容

T 命令:单步执行,trace。执行以cs:ip开始的一条或n条机器指令,并显示寄存器的内容。注意:如果给出地址参数,则一定要在地址前面加上等于。

  • 若不给任何参数,则从CS : IP 开始执行
  • 若给出地址,不给出指令数参数,则在指定地址的指令执行后,不再执行,并显示寄存器状态
  • 若指定地址和指令数,则从指定地址开始执行对应的指令数量

G 命令:从当前位置运行到指定地址处停下。go 连续执行机器指令。-G [=起始地址][断点地址]

  • 若不给出任何参数,则从当前物理地址开始运行,直到运行终止指令才停止。
  • 若只给出起始地址,则从指定地址开始运行,直到运行终止指令才停止
  • 若给定起始地址和断点地址,则从指定地址开始运行,运行到断点结束

P 命令: 执行汇编程序,单步跟踪。与T命令不同的是:P命令不会跟踪进入子程序或软中断。

P命令 的使用方式与 T命令 的使用方式完全相同。
执行循环、重复的字符串指令、软件中断或子例程序。

例如,g:运行程序。q:退出调试模式。

TD 使用入门

点击 http://staff.ustc.edu.cn/~wangqq/td.rar 下载 td (TDebug)

汇编程序 - TD调试:https://www.cnblogs.com/Andy-Lcw/p/11179101.html

也可以使用 td.exe hello.exe 进行调试。Turbo Debugger(TD)属源代码级调试器,可以调试多种由不同语言编写成的程序。Turbo Debugge 中的重叠式窗口、下拉式和弹出式菜单、热键的使用以及对鼠标的支持等,为用户提供了一个快速、方便和交互式的环境。 此外,联机帮助还可以在操作的每个阶段提供相关的帮助。

1.如何载入被调试程序

  • 方法1:转到 TD.EXE 所在目录,在DOS提示符下键入以下命令 (有下划线的部分):D:\MASM>TD,进入TD后,按Alt-F键打开File菜单,选择Open,在文件对话框中输入要调试的程序名,按回车。
  • 方法2:转到TD.EXE所在目录,在DOS提示符下键入以下命令(假定要调试的程序名为HELLO.EXE):D:\MASM>TD HELLO.EXE
  • 方法3:打开 TD.EXE 所在目录,把要调试的程序图标拖放到TD的图标上。

2.如何输入(修改)汇编指令

  • (1)用Tab键选择代码区为当前区域;
  • (2)用方向键把光标移到期望的地址处,如果是输入一个新的程序段,建议把光标移到CS:0100H处;
  • (3)打开指令编辑窗口,有两种方法:
    方法1:在光标处直接键入汇编指令,在输入汇编指令的同时屏幕上就会自动弹出指令的临时编辑窗口。
    方法2:用Alt-F10键激活代码区局部菜单,选择其中的汇编命令,屏幕上也会自动弹出指令的临时编辑窗口。
  • (4)在临时编辑窗口中输入/编辑指令,每输入一条指令,按回车,输入的指令即可出现在光标处(替换掉原来的指令),同时光标自动下移一行,以便让你输入下一条指令。

3.如何查看/修改数据段的数据

  • (1)用Tab键选择数据区为当前区域;
  • (2)使用局部菜单中的“Goto”命令并结合使用方向键把光标移到期望的地址单元处(注意数据区的光标是一个下划线),数据区就从该地址处显 示内存单元的内容。
  • (3)若要修改该地址处的内容,则需打开数据编辑窗口。有两种方法:
  • 方法1:在光标处直接键输入数据,在输入数据的同时屏幕上就会自动弹出数据编辑窗口。
  • 方法2:用Alt-F10键激活数据区局部菜单,选择其中的“Change”命令,屏幕上也会弹出数据编辑窗口。
  • (4)在数据编辑窗口中输入所需的数据,输入完后,按回车,输入的数据就会替代光标处的原始数据。

4.如何修改寄存器内容

  • (1)用Tab键选择寄存器区为当前区域;
  • (2)用方向键把光标移到要修改的寄存器上;
  • (3)打开编辑输入窗口。有两种方法:
  • 方法1:在光标处直接键入所需的值,在键入的同时屏幕上就会自动弹出编辑输入窗口。
  • 方法2:用Alt-F10键激活寄存器区局部菜单,选择其中的“Change”命令,屏幕上也会弹出编辑输入窗口。
  • (4)在编辑输入框中键入所需的值,然后回车,这个新的值就会取代原来该寄存器的内容。

5.如何修改标志位内容

  • (1)用Tab键选择标志区为当前区域;
  • (2)用方向键把光标移到要修改的标志位上;
  • (3)按回车键或空格键即可使标志位的值在0、1之间变化。

6.如何指定程序的起始执行地址

方法1:
 (1)用Tab键选择代码区为当前区域;
 (2)用Alt-F10键激活代码区局部菜单,选择局部菜单中的“New CS:IP”命令。
方法2:
 (1)用Tab键选择寄存器区为当前区域;
 (2)用方向键把光标移到CS寄存器上,输入程序起始地址的段地址;
 (3)用方向键把光标移到IP寄存器上,输入程序起始地址的偏移量。

7.如何单步跟踪程序的执行

  •  (1)用上述第6条中的方法首先指定程序的起始执行地址;
  •  (2)按F7或F8键,每次将只执行一条指令。
  •  注:若当前执行的指令是CALL指令,则F7将跟踪进入被调用的子程序,而F8则把CALL指令及其调用的子程序当作一条完整的指令,要执行完子程序才停在CALL指令的下一条指令上。

8.如何只执行程序的某一部分指令

方法1:用设置断点的方法。
(1)用上述第6条中的方法首先指定程序的起始执行地址;
(2)用方向键把光标移到要执行的程序段的最后一条指令的下一条指令上(注意,不能移到最后一条指令上,否则最后一条指令将不会被执行), 按F2设置断点。也可按Alt-F2键,然后在弹出的输入窗口中输入断点地址。
(3)按F9键执行,程序将会停在所设置的断点处。

方法2:用“运行程序到光标处”的方法。
(1)用上述第6条中的方法首先指定程序的起始执行地址;
(2)用方向键把光标移到要执行的程序段的最后一条指令的下一条指令上(注意,不能移到最后一条指令上,否则最后一条指令将不会被执行)。
(3)按F4键执行程序,程序将会执行到光标处停下。

方法3:用“执行到指定位置”的方法。
(1)用上述第6条中的方法首先指定程序的起始执行地址;
(2)按Alt-F9,在弹出的输入窗口中输入要停止的地址(即要停在哪条指令上,就输入哪条指令的地址),按回车,程序将会执行到指定位置处停下。

9.如何查看被调试程序的显示输出:按Alt-F5键。

10.如何在 Windows2000 中把TD的窗口设置的大一些
按Alt-O键,在下拉菜单中选择Display options项,在弹出的对话框中,用Tab键选Screen lines选项,用←、→键选中“43/50”,按回车。然后按F5键,使CPU窗口充满TD窗口。在window2000下,td 中使用鼠标可能存在一定问题,而 xp 下则完全正常。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐