上古神器:十六位应用程序 Debug 的基本使用

news2024/11/28 22:43:01

文章目录

  • 参考
  • 环境
  • 上古神器 Debug
      • Bug 与 Debugging
      • Debug
          • Debug 应用程序
          • 淘汰原因
          • 使用限制
      • DOSBox
          • 学习 Debug 的必要性
          • DOSBox-X
  • Debug 的基本使用
      • 命令 R
          • 查看寄存器的状态
          • 修改寄存器的内容
      • 命令 D
          • 显示内存中的数据
          • 指定起始内存空间地址
          • 指定内存空间的范围
      • 命令 A
          • 使用命令
          • 语法错误
          • 查看写入内存的机器指令
      • 命令 U
          • 反汇编目标内存空间中存储的机器指令
      • 命令 T
          • 执行目标内存空间中的机器指令
      • 命令 E
          • 对内存中的内容进行逐字节式的修改
          • 一次性实现对多字节内存空间的修改

参考

项目描述
搜索引擎BingGoogle
AI 大模型文心一言通义千问讯飞星火认知大模型ChatGPT
PHP 手册PHP Manual

环境

上古神器 Debug

Bug 与 Debugging

1947 年的某一天,计算机科学家 Grace HopperHarvard Mark II 计算机的维护工作中发现了一个发现了一只 夹在继电器中的飞蛾。这只昆虫导致了计算机的故障,后来人们将这种问题称为 bug

Bug 这个术语被广泛接收,用于描述计算机程序中的 错误。当程序出现意外行为时,程序员通常会说他们需要对程序进行 Debugging,以查找和修复问题。

Debug

Debug 应用程序

Debug 是一个在 MS-DOS 和一些 Windows 系统中提供的命令行工具,用于 诊断程序在运行时产生的错误、异常或意外行为,并据此采取措施来解决问题,以确保程序能够按照预期的方式运行。在早期的 MS-DOSWindows 系统中,Debug 是一个非常有用的工具,尤其是对于 底层(系统级编程) 程序员来说。

淘汰原因

随着时间的推移和技术的发展,debug 的实用性逐渐降低,到目前已经没有什么人在使用了。具体原因整理如下:

项目描述
技术进步现代计算机和现代操作系统功能更加丰富和复杂,使得 Debug 这样的工具变得不那么适用。现代的调试工具,如 Visual StudioGDB 和其他 IDE 中的调试工具,提供了更为高级和强大的功能
64 位架构现代计算机普遍采用 6432 位架构,Debug 在这类计算机中运行需要一个 16 位架构的模拟环境
安全性考虑Debug 允许 直接访问和修改系统的底层硬件(内存,CPU 等),这可能导致安全隐患。
使用限制

Windows 7 64位版本 开始,Windows 系统中就不再包含 debug 应用程序了。

Debug 是一个 16 位应用程序。在 Windows 7 及此前的 32 位 操作系统中能够运行Debug 应用程序,是因为这些系统内置了一个叫做 Windows on Windows(WoW)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 中使用 Rr 是没有区别的。

查看寄存器的状态

Debug 命令行 中,当你单纯地输入 Rr 并敲击回车键时,DEBUG 将显示所有 CPU 寄存器的当前值。具体而言,您将看到如下类似界面:

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0DC0  ES=0DC0  SS=0DC0  CS=0DC0  IP=0100   NV UP EI PL NZ NA PO NC
0DC0:0100 0000          ADD     [BX+SI],AL                         DS:0000=CD

其中

从左往右,从上到下,我们依次对命令 R 的输出内容进行讲解。

  1. AX ~ BX 是一系列寄存器的名称即其保存的数据。
  2. NV ~ NC 则是标志寄存器的 一部分(16 位寄存器,但仅使用了其中的部分二进制位),用于 存储与程序执行相关的信息
  3. 0DC0:0100CS:IP,用于指示 CPU 当前要读取并执行的指令
  4. 0000CS:IP 指向的内存空间 所存储数据的十六进制表示
  5. ADD [BX+SI],ALCS:IP 指向的内存空间中的二进制数据的汇编语言表示。
  6. DS:0000=CD

????

修改寄存器的内容

当您在 Debug 命令行中输入命令 R 的同时 输入目标寄存器的名称 即可修改该寄存器所保存的值。对此,请参考如下界面(尝试修改通用寄存器中的数据):

在输入修改寄存器的名称并敲击回车键后,Debug 将 输出被修改寄存器的当前值 并给出输入提示,要求您 输入被修改寄存器的结果值

我们尝试将 AX 寄存器中的当前值修改为 十六进制数 002F,再通过 R 命令查看修改结果。

命令 D

在 Debug 中,D 命令即 Dump 的简写,该命令用于 查看内存中的数据

显示内存中的数据

当你在 Debug 中直接使用命令 D 时,该命令将显示内存中以 CS:IP 所为首的 128 字节内存空间。对此,请参考如下界面:

命令 D 的输出内容共由三部分内容组成,这三部分(从左至右)分别是地址指示十六进制内容ASCII 表示

  1. 十六进制内容
    十六进制内容是内存空间中 二进制数据的十六进制表示,每两个十六进制数值代表一个字节。这些十六进制数值以 8 字节组块 显示,每两个组块之间用一个 短横线 - 分隔。
  2. ASCII 表示
    ASCII 表示即内存中的 每一个字节解码为 ASCII 字符的结果
  3. 地址指示
    每一行十六进制内容与 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 中,命令 EEdit,表示编辑操作。当你在 Debug 命令行中输入并执行命令 E 时,该命令通常会要求你指定一个 完整的内存地址或偏移地址,在指定 需要修改值的内存空间的首地址 后即可修改内存中的内容。

对内存中的内容进行逐字节式的修改

在 Debug 命令行中输入 E需要修改值的内存空间的首地址 后,Debug 将给出 被修改内存空间的现有值 并提示您输入十六进制值以对其进行修改。在您修改完当前字节大小的内存空间中的内容后,输入空格键进行下一字节空间值的修改,要 结束 对内存空间逐字节式的修改仅需要 敲击回车键 即可。对此,请参考如下示例:

注:

在敲击回车键结束对内存空间进行逐字节式的修改时,存在两种可能的情况:

  1. 已输入修改值
    若敲击回车键前您已经输入修改值,则敲击回车键后 该值将输入对应的内存空间中,随后修改过程立即终止。
  2. 无修改值
    若敲击回车键前您尚未输入任何内容,则敲击回车键后对应内存空间中的内容并不会变为 0000,修改过程将立即终止。
一次性实现对多字节内存空间的修改

在 Debug 命令行中,输入命令 E需要修改值的内存空间的首地址 后,在其后您可以 添加多个对内存空间进行修改的结果值,多个结果值之间 以空格分隔。在输入完毕后,敲击回车键执行对内存空间的修改并立即终止修改过程。对此,请参考如下界面:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1055464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第8章 Spring(二)

8.11 Spring 中哪些情况下,不能解决循环依赖问题 难度:★★ 重点:★★ 白话解析 有一下几种情况,循环依赖是不能解决的: 1、原型模式下的循环依赖没办法解决; 假设Girl中依赖了Boy,Boy中依赖了Girl;在实例化Girl的时候要注入Boy,此时没有Boy,因为是原型模式,每次都…

量化交易全流程(四)

本节目录 数据准备(数据源与数据库) CTA策略 数据源: 在进行量化分析的时候,最基础的工作是数据准备,即收集数据、清理数据、建立数据库。下面先讨论收集数据的来源,数据来源可分为两大类:免…

最新宽字节注入攻击和代码分析技术

点击星标,即时接收最新推文 本文选自《web安全攻防渗透测试实战指南(第2版)》 点击图片五折购书 宽字节注入攻击 宽字节注入攻击的测试地址在本书第2章。 访问id1,页面的返回结果如图4-51所示,程序并没有报错&#xff…

基于树莓派CM4制作img系统镜像批量制作TF卡

文章目录 前言1. 环境与工具2. 制作镜像3. 烧录镜像4. 总结 前言 树莓派烧录完系统做定制化配置比较费时间。在面对大批量的树莓派要配置,那时间成本是非常巨大的。第一次配置完可以说是摸着石头过河,但是会弄了以后再配置,都是一些重复性操…

Canal实现数据同步

1、Canal实现数据同步 canal可以用来监控数据库数据的变化,从而获得新增数据,或者修改的数据。 1.1 Canal工作原理 原理相对比较简单: 1、canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送…

零代码编程:用ChatGPT将特定文件标题重命名为特定格式

一个文件夹里面是同一系列文件,但是有两种命名方法,现在想把文件标题格式统一。 在ChatGPT中输入提示词: 你是一个Python编程专家,要完成一个批量重命名的任务,具体步骤如下: 打开本地电脑文件夹&#xf…

38 翻转二叉树

翻转二叉树 理解题意&#xff0c;翻转即每个结点的左右子树翻转/对调题解1 递归——自下而上题解2 迭代——自上而下 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 提示&#xff1a; 树中节点数目范围在 [0, 100] 内-100 < Node.…

树莓派CM4开启I2C与UART串口登录同时serial0映射到ttyS0 开启多串口

文章目录 前言1. 树莓派开启I2C与UART串口登录2. 开启多串口总结&#xff1a; 前言 最近用CM4的时候使用到了I2C以及多个UART的情况。 同时配置端口映射也存在部分问题。 这里集中记录一下。 1. 树莓派开启I2C与UART串口登录 输入指令sudo raspi-config 跳转到如下界面&#…

机器人过程自动化(RPA)入门 9. 管理和维护代码

仅仅创建一个自动化项目是不够的。无论是决定使用哪种布局,还是正确命名步骤,以正确的方式组织项目都很重要。项目也可以在新的项目中重用,这对用户来说非常方便。本章解释了我们可以重用项目的方法。我们还将学习配置技术并看到一个示例。最后,我们将学习如何集成TFS服务器…

第十二章 类和对象——封装

C面向对象的三大特性为&#xff1a;封装、继承、多态 C认为万事万物都皆为对象&#xff0c;对象上有其属性和行为 例如&#xff1a; 人可以作为对象&#xff0c;属性有姓名、年龄、身高、体重...&#xff0c;行为有走、跑、跳、吃饭、唱歌... 车也可以作为对象&#xff0c;…

89、Redis 的 value 所支持的数据类型(String、List、Set、Zset、Hash)---->Zset 相关命令

本次讲解要点&#xff1a; ** Set相关命令&#xff1a;是指value中的数据类型** 启动redis服务器&#xff1a; 打开小黑窗&#xff1a; C:\Users\JH>e: E:>cd E:\install\Redis6.0\Redis-x64-6.0.14\bin E:\install\Redis6.0\Redis-x64-6.0.14\bin>redis-server.exe …

Android-Q 对 startActivity() 做了限制,怎么适配?

一. Q 禁用后台启动 Activity 今天来聊聊“Android Q 中后台禁止启动 Activity 对现有国内 App 中启动页设计的影响”这个话题&#xff0c;再聊聊 Android Q 限制后台启动 Activity 的具体细节。 有人可能会觉得 P 还没用上&#xff0c;Q 还远着。如果只是对于普通用户来说&a…

为什么要使用虚拟机?VMware安装使用

前言 大家好&#xff0c;本文是讲述了为什么需要使用虚拟机、使用虚拟机的好处&#xff0c;以及如何在Windows系统中安装VMware。希望对大家有所帮助~ 目录 前言一、为什么要安装使用虚拟机&#xff1f;1.1、什么是虚拟机&#xff1f;1.2、虚拟机的核心组件1.3、使用虚拟机的好…

【RabbitMQ】常用消息模型详解

文章目录 AMQP协议的回顾RabbitMQ支持的消息模型第一种模型(直连)开发生产者开发消费者生产者、消费者开发优化API参数细节 第二种模型(work quene)开发生产者开发消费者消息自动确认机制 第三种模型(fanout)开发生产者开发消费者 第四种模型(Routing)开发生产者开发消费者 第五…

网络-fetch

文章目录 前言一、fetch简介优点&#xff1a;缺点&#xff1a; 二、使用getpost进度实现取消请求超时实现 总结 前言 本文主要记录浏览器与服务端网络通讯 fetch 的介绍与使用&#xff0c;将完成get、post、进度、取消请求、和超时请求的功能实现。 一、fetch简介 fetch作为继…

基于自适应启动策略的混合交叉动态约束多目标优化算法(MC-DCMOEA)求解CEC2015/CEC2018/CEC2023(MATLAB代码)

一、动态多目标优化问题 1.1问题定义 1.2 动态支配关系定义 二、 基于自适应启动策略的混合交叉动态多目标优化算法 基于自适应启动策略的混合交叉动态多目标优化算法&#xff08;Mixture Crossover Dynamic Constrained Multi-objective Evolutionary Algorithm Based on Se…

深度学习(1)---卷积神经网络(CNN)

文章目录 一、发展历史1.1 CNN简要说明1.2 猫的视觉实验1.3 新认知机1.4 LeNet-51.5 AlexNet 二、卷积层2.1 图像识别特点2.2 卷积运算2.3 卷积核2.4 填充和步长2.5 卷积计算公式2.6 多通道卷积 三、池化层 一、发展历史 1.1 CNN简要说明 1. 卷积神经网络&#xff08;Convolut…

【51单片机编写占空比按秒渐亮与渐暗】2023-10-2

昨天刚在W10上安装CH340驱动&#xff0c;又下载到板子上LCD1602定时器时钟程序&#xff0c;为了调试&#xff0c;调用了一个LED观察控制蜂鸣器按秒响的变量&#xff0c;几经调试才发觉该开发板用的是有源蜂鸣器&#xff0c;不用IO取反操作&#xff0c;直接控制IO的高低电平即可…

手机号码格式校验:@Phone(自定义参数校验注解)

需求 新增接口 和 修改接口 中&#xff0c;手机号码的格式校验是普遍需要的。 在每个手机号码字段上添加正则表达式校验注解来实现校验&#xff0c;重复书写&#xff0c;容易出错&#xff1b;在不同的手机号码字段上&#xff0c;可能使用了不同的校验规则&#xff0c;无法有效…