使用debug 可以完成以下功能:

  1. 可以查看 和改变 CPU 中,寄存器的内容;
  2. 可以查看 和改变内存中的内容;
  3. 可以将内存中的 机器指令 翻译成汇编指令
  4. 使用汇编指令 在 内存中 存入 机器指令
  5. 执行机器指令

首先,启动 Debug,在DOS提示符下输入命令:debug

  1. debug 中,不区分大小写

  2. 注意,DEBUG 下的数据都是十六进制数

  3. 查看内存地址时, 当输入的地址数据不足 4位时, 默认是从高位开始补零的;

1. 寄存器中的数据

1.1 查看寄存器中的内容

直接键入 R —— 将显示 CPU 所有的寄存器和标志位;

观察下图可知:

四个段寄存器 DS、ES、SS、CS 的值都是 0740H,说明现在系统处在同一个逻辑段中(不同的系统环境下,段寄存器的值可能不一样,dosemu 虚拟机中为 07BEH)。

  • 操作系统根据内存的情况为各段分配段地址,因此每台机器或每次运行时段地址值可能会不一样。

  • IP 指令指针寄存器的值是 0100H,表示将要执行的指令在代码段的 0100H 单元中。

  • 该指令单元的逻辑地址应该由 CS:IP 构成,即 0740:0100H。

1.2 修改寄存器中的内容

  1. 在 R 后跟写寄存器名(比如 R AX),
  2. 回车后先显示寄存器的内容,
  3. 在冒号后键入新的值;

注意,DEBUG 下的数据都是十六进制数

再用 R 命令就可看到修改后的内容了。

2. 内存中的数据

2.2 查看内存中的内容

  • D - 列出预设地址内存处的128个字节的内容

注意, 最开始列出的 内存的 地址处, 默认是从 cs: ip 所指向的 内存地址,
即当前 需要执行指令的 开始处 ;

  • D 段地址:偏移地址 - 列出内存中指定地址处的内容

  • D 段地址:偏移地址 结尾偏移地址 代表: 列出内存中指定地址范围内的内容

2.3 修改内存中的内容

按照顺序 逐个修改的方式,

  • E 段地址:偏移地址 数据1 数据2 …

另外一种逐个修改的方式, 适用于指定内存单元处的修改:

  • E 段地址:偏移地址
  • 逐个询问式修改
  • 空格 - 接受,继续
  • 回车 - 结束

3. 返回汇编: 机器指令翻译成汇编指令

首先将以下 机器指令写入到 内存单元中的 cs: ip 开始的地方:
:对应的机器码为
B8 23 01
BB 03 00
89 D8
01 D8
查看 内存中 写入结果,如上图所示

3.1 机器码 对应的汇编指令

然后, 用u命令可以查看内存中机器指令所对应的汇编指令。

:有汇编指令
mov ax, 0123H
mov bx, 0003H
mov ax, bx
add ax, bx

U 后跟偏移地址,则从该地址开始反汇编。如:

U 0       从代码段0号单元开始反汇编
U100     从代码段100H号单元开始反汇编

3.2 机器指令与汇编指令的对应关系

注意, 用 r 命令查看 时,
最后一行, 显示的 cs:ip 当前 cpu 将要执行的下一个指令, 该指令的地址, 对应的机器码, 以及对应的汇编指令;

我们来看在寄存器的下面那一行的表示。该行显示的是代码段的一条指令的反汇编。

  • 所谓反汇编,指的是将二进制的机器指令显示成汇编指令。

  • 由三部分构成:最左边 07BE:0100 表示该指令所在单元的逻辑地址,中间 F60000 表示该指令的机器码,第 3 列显示为汇编指令 TEST BYTEPTR [BX+SI],00,该指令为 TEST 测试指令。

通过 DEBUG,我们就可知道一条汇编指令翻译成机器代码是什么值了;反之也一样,对一条机器指令也可得知它代表什么汇编指令。

如图中的, 标志寄存器的最高位 是 溢出标志, 此时的状态是 NV ,代表此时值为0;
在图的最右边显示的是 CPU 标志寄存器各标志位的状态,可对照表 2-1 观察一下现在系统的状态。

4. 汇编指令写入内存中

用A命令以汇编指令的格式在内存中写入机器指令;
回车后可输入下一条指令,直接回车则退出输入。

:有汇编指令
mov ax, 0123H
mov bx, 0003H
mov ax, bx
add ax, bx

注意, 用 r 命令查看 时,
最后一行, 显示的 cs:ip 当前 cpu 将要执行的下一个指令, 该指令的地址, 对应的机器码, 以及对应的汇编指令;

:对应的机器码为
B8 23 01
BB 03 00
89 D8
01 D8

5. 执行指令

5.1 t 执行指令

用T命令执行机器指令;

T 命令每执行一次,都要显示当前寄存器的状况,我们可以随时了解指令的执行情况。

T 命令还可以连续执行多条指令。如上例中连续执行 3 条指令,可用如下 T 命令:

-T 3

T 命令也可以设置开始地址和执行条数。如上例中从 0100H 开始连续执行 3 条指令,可用如下 T 命令:

-T =0100  3

5.2 p 执行指令

P 命令的作用与 T 命令相同,当遇到中断指令 INT n 和调用指令CALL时,应该使用 P 命令,以确保程序正常执行。这是因为INT n指令和 CALL 指令都要转移到子程序去执行,T 命令进入子程序后可能无法返回;而 P 命令则直接执行该指令,并将结果带回。遇到循环指令 LOOP 时也应该使用 P 命令,可以使循环快速结束。

5.3 G 命令——连续执行程序

有关连续执行命令 G 的用法我们放到后面章节中学习

q - 退出Debug

6. 小结

在 DOS 操作系统和 Windows 操作系统中,都提供了调试工具 DEBUG。

DEBUG 是为汇编语言设计的一种调试工具,它通过单步、设置断点等方式为程序员提供了非常有效的调试手段。利用它可以观察和修改 CPU 的寄存器、内存单元;可以跟踪程序的运行,发现程序的错误。

实验楼环境中采用 dosemu 来模拟 DOS 环境,进入 DOS 环境中可以直接启动 DEBUG 程序。

DEBUG 命令有 20 多个,我们主要学习最常用的命令。

注意:DOS 和 DEBUG 命令都支持不区分大小写。

R ——查看和修改寄存器
D ——查看内存单元
E ——修改内存单元
U ——反汇编,将机器指令变为汇编指令
T / P ——单步执行
G ——连续执行程序
A ——输入汇编指令
Q ——退出
  • cd\ ——首先要用 cd\ 退回到根目录 C> 下
  • dir ——显示文件列表
  • md hb ——建立 hb 子目录
  • cd hb ——进入 hb 子目录
  • copy d:\dos\masm.exe c:\hb ——将 D 盘 dos 目录下的 masm.exe 拷贝到 C 盘 hb 目录下
  • copy d:\dos\link.exe c:\hb ——将 D 盘 dos 目录下的 link.exe 拷贝到 C 盘 hb 目录下
  • cd .. ——退回到上一级目录
  • del \hb\masm.exe ——删除 hb 子目录中的某文件
  • rd hb ——删除 hb 子目录(子目录中的所有文件必须先删除)
  • e: ——进入 e 盘
  • cls ——清屏
  • type ——显示文本文件内容(如 type c:\hb\abc.asm)

6.2 内容解释


其中左边一列为逻辑地址,中间部分为存储单元的内容。

每行为 16 个字节单元,中间的小横线用于区分前 8 个单元和后 8 个单元。在逻辑地址中只给出每行第一个单元的偏移地址,其余 15 个单元的偏移地址没有标出。可以推断出图中第一行单元的偏移地址从 0000H 到 000FH,第二行单元的偏移地址为 0010H~001FH,以此类推。右边部分显示出内存单元中的 ASCII 码表示的字符,无法显示时用小点代替。

  • 图中第一条 D 命令: d ds:0 显示的是数据段存储单元的内容,可以看到数据段的段地址为 DS,其值 0B05H。

    0 号单元的内容为 CDH,1 号单元为 20H ,…,第 15 号单元的内容为 03H;第二行 0010H 号(16 号)单元的内容为 69H,它是小写字母 i 的 ASCII 码,因此右边区域中显示了 i ,表示该单元的值 69H 可以看成 ASCII 码。

  • 第二条 D 命令: d 0200:0 显示 0200H 段中的内容,也是从 0 号单元开始。

  • 第三条 D 命令: d 0200:5 15从 0200H 段的 5 号单元开始显示直到 15H 号单元。

如果在 D 后面直接写出偏移地址,则显示当前数据段下偏移地址开始的内存单元,如:

D 10        从数据段10H号单元开始显示
D100    从数据段100H号单元开始显示

注意:多次键入 D,可连续显示后面的单元内容。

汇编语言ch2_2 汇编语言中的debug相关推荐

  1. 汇编语言统计字符串中字符的个数

     因为作业里面有一个题,需要用汇编语言统计字符串中字符的个数,然而老师给的答案居然是错的.为什么呢,因为arm是字对齐的,答案居然每个字只比较一次就过去了,我去,每个字是有四个字节的,这能对吗,所以, ...

  2. 关于8051汇编语言的keil中出现的A45: UNDEFINED SYMBOL (PASS-2)错误

    关于8051汇编语言的keil中出现的A45: UNDEFINED SYMBOL (PASS-2)错误 ORG 0000HLJMP MAINORG 000BH ;提示错误 error A45: UND ...

  3. RISC-V嵌入式开发入门篇2:RISC-V汇编语言程序设计(中)

    原文出处:https://mp.weixin.qq.com/s/3RHss3vhfK004-TtM8fpeA 随着国内第一本RISC-V中文书籍<手把手教你设计CPU--RISC-V处理器篇&g ...

  4. 在 IDEA 中使用 Debug,真是太厉害了!

    点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 作者:baojiangzhou http://www.cnblogs.com/chiangcho ...

  5. 最详细的IDEA中使用Debug教程

    Debug用来追踪代码的运行流程,通常在程序运行过程中出现异常,启用Debug模式可以分析定位异常发生的位置,以及在运行过程中参数的变化.通常我们也可以启用Debug模式来跟踪代码的运行流程去学习三方 ...

  6. Android中解决debug.keystore到期的问题

    开发Android或者jee或者其他java应用时,如果eclipse中的项目前有个红叉叉,但是src下有没有任何提示错误但是又不能通过编译的时候如何找到项目工程的错误根源呢?方法如下: 打开ecli ...

  7. Scrapy框架的学习(7. 了解Scrapy中的debug信息以及Scrapy shell的使用)

    认识程序中的debug信息 https://blog.csdn.net/wei18791957243/article/details/86157707  这个博客里写了,怎么关闭这些debug信息 因 ...

  8. 如何在 jetbrick-template 中使用 debug函数?

    为什么80%的码农都做不了架构师?>>>    debug 函数格式 jetbrick-template 已经内置了一个 debug 函数: 格式如下: void debug(Str ...

  9. Intellij IDEA 重置所有工具栏 Intellij IDEA 中的 Debug 控制台输出窗口不见了的解决办法

    Intellij IDEA 中的 Debug 控制台输出窗口不见了的解决办法 在 Debug 工具窗口,如图点击左侧重置布局图标,你的console窗口就还原了.

最新文章

  1. JavaScript--事件模型
  2. 大话主题敏感PageRank
  3. T - Memory and Trident CodeForces - 712B( 注意:* ++ = 的优先级
  4. 嵌入式OS入门笔记-以RTX为案例:二.快速移植到RTX
  5. 程序员工作3年只涨2千,你不知道程序员有多难!
  6. JavaScript | 如何为变量分配十进制,八进制和十六进制值?
  7. 实现iframe_面试官:来说说单点登录的三种实现方式
  8. [图解]红旗Linux6.0下如何安装VMWARE TOOLS
  9. zeromq不需要消息服务器,ZeroMQ发布订阅TCP丢弃消息订阅服务器失败
  10. 商户管理后台/消费统计管理/云平台商户端管理后台原型/PaaS金融服务平台商户端管理后台原型/企业管理系统后台/账户管理/工单管理/充值管理/汇款单管理/余额管理/用户管理/认证管理/web后台原型
  11. Google Talk Testing(早期版本)
  12. Navicat for Mysql 如何备份数据库
  13. VBA教程初级(一):简单宏
  14. ad16怎么画弧线_ad16怎么画弧线_板绘是什么?怎么用?
  15. php 字符串长度函数
  16. excel基础知识大全_冷轧基础知识学习(八)
  17. BZOJ 5442 [Ceoi2018]Global warming
  18. 解决CondaVerificationError: The package for pytorch located at...
  19. 卿学姐与诡异村庄(并查集)
  20. 派森学python_派森个人学习笔记------2020.09.06

热门文章

  1. IT之路回想以及未来展望
  2. 大数据DTSpark蘑菇云行动之 第一课:Scala语言开发环境搭建
  3. 生活随笔:发现微博账号名和自己名一样
  4. [C++] [OpenGL] 用FreeType渲染文字
  5. 情感分析学习笔记(2)——SO-PMI算法详解
  6. Glide源码阅读之模板模式2
  7. 讲体育教师资格证注意事项
  8. html超链接怎么新建窗口打开,html超链接新窗口打开怎么写
  9. 开源虚拟声卡解决方案
  10. 为什么有人工作很忙碌,但不出成绩,然后还是一直很忙碌?