网站制作软件教程,wordpress 菜单图标,做网站文字居中代码,企业微信开发者文档文章目录 参考环境上古神器 DebugBug 与 DebuggingDebugDebug 应用程序淘汰原因使用限制 DOSBox学习 Debug 的必要性DOSBox-X Debug 的基本使用命令 R查看寄存器的状态修改寄存器的内容 命令 D显示内存中的数据指定起始内存空间地址指定内存空间的范围 命令 A使用命令语法错误查… 文章目录 参考环境上古神器 DebugBug 与 DebuggingDebugDebug 应用程序淘汰原因使用限制 DOSBox学习 Debug 的必要性DOSBox-X Debug 的基本使用命令 R查看寄存器的状态修改寄存器的内容 命令 D显示内存中的数据指定起始内存空间地址指定内存空间的范围 命令 A使用命令语法错误查看写入内存的机器指令 命令 U反汇编目标内存空间中存储的机器指令 命令 T执行目标内存空间中的机器指令 命令 E对内存中的内容进行逐字节式的修改一次性实现对多字节内存空间的修改 参考
项目描述搜索引擎Bing、GoogleAI 大模型文心一言、通义千问、讯飞星火认知大模型、ChatGPTPHP 手册PHP Manual
环境
上古神器 Debug
Bug 与 Debugging
1947 年的某一天计算机科学家 Grace Hopper 在 Harvard Mark II 计算机的维护工作中发现了一个发现了一只 夹在继电器中的飞蛾。这只昆虫导致了计算机的故障后来人们将这种问题称为 bug。
Bug 这个术语被广泛接收用于描述计算机程序中的 错误。当程序出现意外行为时程序员通常会说他们需要对程序进行 Debugging以查找和修复问题。 Debug
Debug 应用程序
Debug 是一个在 MS-DOS 和一些 Windows 系统中提供的命令行工具用于 诊断程序在运行时产生的错误、异常或意外行为并据此采取措施来解决问题以确保程序能够按照预期的方式运行。在早期的 MS-DOS 和 Windows 系统中Debug 是一个非常有用的工具尤其是对于 底层系统级编程 程序员来说。
淘汰原因
随着时间的推移和技术的发展debug 的实用性逐渐降低到目前已经没有什么人在使用了。具体原因整理如下
项目描述技术进步现代计算机和现代操作系统功能更加丰富和复杂使得 Debug 这样的工具变得不那么适用。现代的调试工具如 Visual Studio、GDB 和其他 IDE 中的调试工具提供了更为高级和强大的功能。64 位架构现代计算机普遍采用 64 及 32 位架构Debug 在这类计算机中运行需要一个 16 位架构的模拟环境。安全性考虑Debug 允许 直接访问和修改系统的底层硬件内存CPU 等这可能导致安全隐患。
使用限制
从 Windows 7 64位版本 开始Windows 系统中就不再包含 debug 应用程序了。
Debug 是一个 16 位应用程序。在 Windows 7 及此前的 32 位 操作系统中能够运行Debug 应用程序是因为这些系统内置了一个叫做 Windows on WindowsWoW 的 16 位子系统 来支持 16位 的应用程序。但在 64 位Windows 中这个16位子系统被移除因此 Debug 不能在 64 位 Windows上运行。
DOSBox
学习 Debug 的必要性
学习 16 位 汇编的过程中Debug 仍然是必不可少的。其理由整理如下
项目描述简单直观Debug提供了一个简单的环境允许用户直接输入、执行、调试汇编代码。对于初学者来说这可以 直观地看到指令是如何工作的不需要复杂的设置或其他工具。实时交互使用debug你可以 实时地查看和修改 CPU 寄存器、内存和其他系统资源中的数据这对于理解汇编语言和计算机的工作原理非常有帮助。传统和历史在很多早期的计算机科学和工程课程中debug是教学 16 位汇编的标准工具。虽然现在有更先进的工具和环境但 debug 仍然被用作教育工具。。
DOSBox-X
DOSBox-X 是一个 开源的 x86 模拟器主要用于运行 早期操作系统 MS-DOS 中的应用程序。与原始的 DOSBox 相比DOSBox-X 提供了 更多的特性并对原有缺陷进行了改进使其 更加适合用于模拟早期的 PC 环境。 如果你希望在不支持 16 位应用程序如 Debug的操作系统中使用它们那么你需要一个模拟器而 DOSBox-X 就是一个很好的选择。 DOSBox-X 在其官网提供了不同的安装包如果您需要使用到 DOSBox-X请前往下载安装。
Debug 的基本使用
命令 R
在 Debug 中R 命令即 Register 的简写该命令用于 查看或修改寄存器中的内容。
注
在 Debug 中命令与寄存器名称等均是不区分大小写的。就命令 R 而言在 Debug 中使用 R 与 r 是没有区别的。
查看寄存器的状态
在 Debug 命令行 中当你单纯地输入 R 或 r 并敲击回车键时DEBUG 将显示所有 CPU 寄存器的当前值。具体而言您将看到如下类似界面
AX0000 BX0000 CX0000 DX0000 SPFFEE BP0000 SI0000 DI0000
DS0DC0 ES0DC0 SS0DC0 CS0DC0 IP0100 NV UP EI PL NZ NA PO NC
0DC0:0100 0000 ADD [BXSI],AL DS:0000CD其中
从左往右从上到下我们依次对命令 R 的输出内容进行讲解。
AX ~ BX 是一系列寄存器的名称即其保存的数据。NV ~ NC 则是标志寄存器的 一部分16 位寄存器但仅使用了其中的部分二进制位用于 存储与程序执行相关的信息。 0DC0:0100 即 CS:IP用于指示 CPU 当前要读取并执行的指令。0000 即 CS:IP 指向的内存空间 所存储数据的十六进制表示。ADD [BXSI],AL 即 CS:IP 指向的内存空间中的二进制数据的汇编语言表示。DS:0000CD
????
修改寄存器的内容
当您在 Debug 命令行中输入命令 R 的同时 输入目标寄存器的名称 即可修改该寄存器所保存的值。对此请参考如下界面尝试修改通用寄存器中的数据 在输入修改寄存器的名称并敲击回车键后Debug 将 输出被修改寄存器的当前值 并给出输入提示要求您 输入被修改寄存器的结果值。
我们尝试将 AX 寄存器中的当前值修改为 十六进制数 002F再通过 R 命令查看修改结果。 命令 D
在 Debug 中D 命令即 Dump 的简写该命令用于 查看内存中的数据。
显示内存中的数据
当你在 Debug 中直接使用命令 D 时该命令将显示内存中以 CS:IP 所为首的 128 字节内存空间。对此请参考如下界面 命令 D 的输出内容共由三部分内容组成这三部分从左至右分别是地址指示、十六进制内容 及 ASCII 表示。
十六进制内容 十六进制内容是内存空间中 二进制数据的十六进制表示每两个十六进制数值代表一个字节。这些十六进制数值以 8 字节 的 组块 显示每两个组块之间用一个 短横线 - 分隔。ASCII 表示 ASCII 表示即内存中的 每一个字节解码为 ASCII 字符的结果。地址指示 每一行十六进制内容与 ASCII 表示都与连续的 16 字节内存空间中的内容相对应而地址指示则用于表示这 连续的 16 字节内存空间的起始字节所处的位置。地址指示由 段地址、: 及 偏移地址 三部分组成。
指定起始内存空间地址
在使用 D 命令的过程中您还可以通过如下格式来指定起始内存空间的地址Debug 将 显示以起始内存空间为首的 128 字节内存空间。
D 起始内存空间的段地址:起始内存空间的偏移地址举个栗子 当然你还可以 仅指定起始内存空间的偏移地址在任何需要内存空间地址的地方段地址通常都是可以直接省略的✨起始内存空间的段地址将自动从 DS 寄存器中获取。对此请参考如下示例 指定内存空间的范围
在使用 D 命令的过程中在指定被查看内存空间的起始地址外您 还可以指定被查看内存空间的结束地址。指定被查看内存空间范围的命令格式为
D 起始内存空间的段地址:起始内存空间的偏移地址 结束内存空间的偏移地址举个栗子 起始内存空间的段地址可以被省略段地址被省略后Debug 将自动使用 DS 寄存器中存储的段地址。对此请参考如下示例 命令 A
在 Debug 中A 命令即 Assemble 的简写该命令用于 以汇编语言的形式在内存中写入机器指令。
使用命令
使用命令 A 时你可以通过 给出地址来指示需要写入命令的起始内存空间。在不指定地址的情况下该命令默认在 CS:IP 所指向的内存空间中开始执行输入。
语法错误
在使用命令 A 以汇编语言的形式在内存中写入机器指令时若汇编语言存在语法错误则写入操作将失败且 Debug 将提示输入地址没有发生变化你重新进行输入。对此请参考如下界面 查看写入内存的机器指令
当你向内存输入命令完毕后可以在 A 命令的输入提示界面下 直接敲击回车键结束输入。 在结束输入后尝试通过命令 D 查看内存空间中输入的内容。对此请参考如下界面 命令 U
在 Debug 中U 命令即 Unassemble该命令用于 将指定内存空间存储的机器指令翻译为汇编代码。使用该命令时若未指定内存空间地址则使用 CS:IP 所存储的地址。
反汇编目标内存空间中存储的机器指令
使用 D 仅能够查看存储在内存空间中的机器指令有了 U 命令我们就能验证我们刚刚是否成功将汇编指令输入内存中了。 命令 T
在 Debug 中T 命令即 Trace 的简写该命令将 允许您逐步执行程序的指令以便查看程序在每一步的执行情况从而提高发现问题的可能有助于实现问题的解决。
执行目标内存空间中的机器指令
T 命令允许您指定需要被执行指令所处的内存地址默认情况下T 命令将使用由 CS:IP 提供的地址。
在此前我们通过 A 命令已经向内存中输入了如下指令
MOV AX, 100
ADD AX, BX其中
MOV AX, 100 表示将寄存器 AX 中的值设置为 100而 ADD AX, BX 则表示将 AX BX 的结果设置为 AX 的值。
我们尝试通过 T 命令来观察指令的执行。对此请参考如下界面
MOV AX, 100 ADD AX, BX 命令 E
在 Debug 中命令 E 即 Edit表示编辑操作。当你在 Debug 命令行中输入并执行命令 E 时该命令通常会要求你指定一个 完整的内存地址或偏移地址在指定 需要修改值的内存空间的首地址 后即可修改内存中的内容。
对内存中的内容进行逐字节式的修改
在 Debug 命令行中输入 E 及 需要修改值的内存空间的首地址 后Debug 将给出 被修改内存空间的现有值 并提示您输入十六进制值以对其进行修改。在您修改完当前字节大小的内存空间中的内容后输入空格键进行下一字节空间值的修改要 结束 对内存空间逐字节式的修改仅需要 敲击回车键 即可。对此请参考如下示例 注
在敲击回车键结束对内存空间进行逐字节式的修改时存在两种可能的情况
已输入修改值 若敲击回车键前您已经输入修改值则敲击回车键后 该值将输入对应的内存空间中随后修改过程立即终止。无修改值 若敲击回车键前您尚未输入任何内容则敲击回车键后对应内存空间中的内容并不会变为 0000修改过程将立即终止。
一次性实现对多字节内存空间的修改
在 Debug 命令行中输入命令 E 及 需要修改值的内存空间的首地址 后在其后您可以 添加多个对内存空间进行修改的结果值多个结果值之间 以空格分隔。在输入完毕后敲击回车键执行对内存空间的修改并立即终止修改过程。对此请参考如下界面