主要用来解决汇编语言上机难得问题,顺带复习一下汇编语言,为期末减轻负担,有空接着更新。哪里不会点那里,妈妈再也不用担心我学不会汇编了……
一、常用快捷键
快捷键 | 功能 |
ALT + Enter | 进入全屏模式,一秒变大佬 |
CTRL + F7 | 减少跳帧,加速闪烁速度 |
CTRL + F8 | 增加跳帧,减慢闪烁速度 |
CTRL + F9 | 关闭DOSBox |
CTRL + F10 | 显示/隐藏鼠标 |
CTRL + F11 | 加速dos模拟cpu的速度 |
CTRL + F12 | 减慢dos模拟cpu的速度 |
二、常用指令大全
(一)DosBox指令
DosBox指令 | 功能 |
dir | 查看目录中的文件 |
cls | 清屏 |
exit | 退出DOSbox |
copy | 将本地文件拷贝一份出来 |
1.dir指令
dir指令用于列出当前目录下的所有文件和子目录。DOSBox会显示当前目录下的所有文件和子目录,包括它们的名称、大小和最后修改时间。
dir指令的变式
指令 | 功能 | 备注 |
---|---|---|
dir 文件名.* | 通过文件名查找文件夹中的文件 | 可能会有多个同名但是后缀不一致的情况 |
dir 文件名 | 同上 | 同上 |
dir /w | 以宽字节字符集UNICODE显示文件列表,而不是默认的ANSI字符集 | 用于文件较多的情况进行输出 |
dir /p | 如果文件数量过多,逐页显示内容 | 用于文件较多的情况进行输出 |
2.cls指令
清屏指令,顾名思义,清空屏幕。
3.del指令
del + 文件名(完整+后缀)可删除指定文件。
4.exit指令
关闭DOSbox,注意如果在debug模式下需要先按q退出debug模式。
5.copy指令
copy 文件1 文件2 可以在映射目录生成一个与文件1完全一样的文件2。
值得注意的是在未关闭DOSBox的情况下如果在本地目录learn中复制文件empty.asm并命名为test.asm,使用dir命令无法查询到test.asm文件,这是为啥呢?
这是因为DOSBox在启动时会创建一个虚拟的文件系统,将主机系统的某个目录映射为DOSBox内部的一个驱动器,一般是Z驱动器,如果是直接使用命令copy命令进行文件拷贝,由于在DOSBox中进行的操作,这个虚拟的文件系统自然就知道有新的内容增加了进来,并在虚拟的文件系统中增加映射文件的方式,但是如果只是在本地资源管理器进行拷贝,DOSBox并不知道增加了该文件,因此并不会产生一个映射到test文件的方式,最终导致无法调用,无法查看,只能通过重启DOSBox解决。
当然,如果对已经建立映射关系的文件在本地资源管理器进行删除,由于DOSBox找不到该文件了,通过dir自然也就查找不到该文件,但是如果这时又把该文件在本地进行恢复,通过dir又能查找到该文件,说明映射关系不随着文件删除而消失。
(二)masm编译器指令
MASM(Microsoft Macro Assembler)是一种汇编语言编译器,它用于将汇编语言源代码翻译成可执行的机器代码,在DOSbox中使用指令masm + 文件名即可运行masm编译器,将.asm文件编译为二进制代码,并依次生成.obj文件、.lst文件、.crf文件,其中obj默认生成同名文件,可以重新命名,lst文件和crf文件默认不生成,可以通过命名的方式进行生成。
以下是对生成文件的一个汇总。
生成文件 | 功能 | 生成方式 |
目标文件.obj | 包含了汇编源代码转换为机器代码的结果,其中包含机器指令,符号表、节以及重定位信息等内容,通常不可直接执行。 | 默认生成同名文件,可以自定义修改名称。 |
列表文件.lst | 包含了汇编源代码和对应的机器指令的汇编列表。 | 默认不生成,可以通过命名的方式生成。 |
交叉引用文件.crf | "交叉引用"通常指的是源代码中的各种元素(如函数、变量、类型等)和它们在源代码中的位置之间的引用关系,简单来说,就是可以查看某个函数或变量在什么时候被调用了。 | 默认不生成,可以通过命名的方式生成。 |
注:1.上述的目标文件的节不同于我们经常认知的段,代码节(Code Section)也不是我们理解的代码段(Code Segment),代码节作为目标文件的一部分,始终保存在硬盘中,但是代码段会随着进程的需要将其中的二进制编码从硬盘运送到内存,最终经过高速缓存后进入CPU执行。
2.lst文件示例:
(三)link工具指令
link是Microsoft提供的一个工具,它被用于将一个或多个目标文件(.obj 文件)链接成一个可执行文件(.exe 文件)或者一个动态链接库(.dll 文件),具体来说,就是用来解决函数互相调用的问题。
一般情况下通过link + obj文件的名称即可执行,但是其完整的代码如下:
LINK objectfiles [,exefile] [,mapfile] [,libraries] [,deffile] [,optionfile];
这些参数的含义如下:
- objectfiles:需要链接的目标文件(obj文件)列表,使用空格分隔。
- exefile:输出的可执行文件(exe文件)的名字。
- mapfile:链接过程生成的map文件,用于调试。
- libraries:链接过程中需要的库文件。
- deffile:包含模块定义的文件。
- optionfile:包含其他选项的文件。
以下是其生成文件:
生成文件 | 功能 | 生成方式 |
可执行文件.exe | 这是链接程序的主要输出文件,也称为可执行程序或应用程序。它是已连接和解析的目标文件的结果,可以直接在操作系统上运行。 | 默认生成同名文件,可以自定义修改名称。 |
库文件.lib | 如果目标文件引用了外部库(例如静态库或共享库),链接程序可能会生成一个库文件(通常以.lib或.a为扩展名)。库文件包含了编译好的函数和数据,供可执行文件在运行时链接和使用。 | 默认不生成,可以通过命名的方式生成。 |
映射文件.map | 链接程序有时会生成一个映射文件,用于显示链接后的可执行文件的内存布局、段的大小、符号地址等信息。 | 默认不生成,可以通过命名的方式生成。 |
注:头文件(Header files)和库文件(Library files)不一样,头文件是用于声明函数、数据结构和常量的文件,通常包含在源代码文件中,而库文件包含了已编译的函数和数据的二进制代码,可以在链接时被引用和使用。
(四)debug命令集
下面是命令总览,之后是详细说明。
命令(大小写都可以) | 功能 | 备注 |
R(Register) | 用于显示或修改CPU寄存器的值 | |
U(Unassemble) | 以汇编指令的形式显示内存中的内容(对机器码进行反汇编) | |
G(Go) | 让程序从当前位置开始执行,直到断点或者程序结束 | |
D(Dump) | 以十六进制形式显示内存中的内容 | |
T(Trace) | 单步执行指令,执行完会更新寄存器内容并进行显示 (可以理解为默认调用了一次r) | |
1.R(Register)指令
单独一个r可以显示所有寄存器的当前值,通过r + 寄存器可以修改该寄存器的值进行调试。
2.U(Unassemble)命令
以汇编指令的形式显示内存中的内容(对机器码进行反汇编)。
3.G(Go)命令
让程序从当前位置开始执行,直到断点或者程序结束,和u指令组合使用可以通过g数字的组合可以让程序运行n步停止。
4.D(Dump)指令
以十六进制形式显示内存中的内容,一共是16 * 8 = 128字节。
通过d + 偏移地址的方式可以从该地址开始查看128字节,需要格外注意的是,初始状态d指令查看内存的基地址是CS的内容,如果加入了偏移地址但是没有给定基地址的话基地址默认为DS的内容,在之后的过程中如果没有指定,那么基地址内容将保持不变。
当然,如果觉得128字节太多,可以在偏移地址后面再加一个偏移地址作为结束地址,由于前一个偏移地址本质上就是设置一个地址起点,再设置一个地址当然就是地址终点,下面的例子中就是以偏移地址2为起点,偏移地址3为终点的一个内存显示形式。
5. T(Trace)指令
t为单步执行指令执行完会更新寄存器内容并进行显示(可以理解为默认调用了一次r)。