实验1:查看CPU和内存,用机器指令和汇编指令编程


一、Debug的使用

1.1 什么是Debug

Debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具。使用它可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。

1.2 Debug功能

命令功能
R命令查看、改变CPU寄存器的内容
D命令查看内存中的内容
E命令改写内存中的内容
U命令将内存中的机器指令翻译为汇编指令
T命令执行一条机器指令
A命令以汇编指令的格式在内存中写入一条机器指令

1.3 进入Debug

Debug是在DOS方式下使用的程序。我们在进入Debug之前,先进入到DOS方式,用以下方式可以进入DOS。

  1. 重启计算机,进入DOS,此时是实模式的DOS
  2. 在Windows中进入DOS方式,进入的是虚拟8086模式的DOS

在Windows下进入Debug的方法:

(a) 打开cmd

在这里插入图片描述
(b) 由于64位机没有debug,为了使用debug,先输入mount c F:\DOSBox\Masm
之后输入c: 跳转至C盘
后输入debug,即可进入debug

在这里插入图片描述

1.4 使用R命令查看、改变CPU寄存器中的内容

在这里插入图片描述
在这里我们可以查看到CS:IP = 07EF:0100 也就是说CPU当前要读取、执行的指令,机器码是00 00,对应的汇编指令为ADD [BX + SI],AL

其他信息之后在进行讲解

还可以使用R命令来改变寄存器中的内容
在这里插入图片描述
输入r ax即可修改AX中的内容,想查看修改后的结果可以再用R命令查看

1.5 用Debug的D命令查看内存中的内容

如果我们想知道内存10000H处的内容,可以用d 段地址:偏移地址的格式来查看

在这里插入图片描述
使用 d 段地址:偏移地址 的格式,Debug将列出从指定内存单元开始的128个内存单元中的内容

D命令会输出3部分内容:

  1. 中间部分的内容
    中间是从指定地址开始128个内存单元中的内容,用16进制的格式进行输出,每行的输出从16的整数倍的地址开始,最多输出16个单元的内容,从图中,我们可以知道内存073F:0单元中的内容是CDH,内存073F:1的内容是20

每行中间有一个“-”,他将每行输出分为两个部分,便于查看,比如要在途中找出1000:6B的内容,可以从1000:60找到行,“-”前面是1000:60 ~ 1000:67的8个单元,后面是1000:68 ~ 1000:6F的8个单元,这样我们就可以从1000:68单元向后数3个单元,找到1000:6B单元。

  1. 左边是每行的起始地址

  2. 右边是每个内存单元中的数据对应的可显示的ASCII码字符。073F:0、073F:1、073F:2中存放的数据是CD、20、3E,他们对应的ASCII字符分别是. >,没有对应的ASCII字符,在Debug中就用“.”去代替

我们在Debug中看到的是原来就在内存中的内容,这些内容都可能会随时改变,当然我们也可以去改变内存、寄存器中的内容。

使用d 1000:9查看1000:9处的内容
在这里插入图片描述
Debug从1000:9开始显示,一直到1000:88,一共是128个字节,第一行中的1000:0~1000:8单元中的内容不显示。

在已进入Debug之后,用D命令直接查看,将列出Debug预设地址处的内容,如图
在这里插入图片描述
使用d 段地址:偏移地址之后,可以接着使用D命令列出后续内容
在这里插入图片描述
也可以去指定D命令的查看范围,采用d 段地址:偏移地址 结尾偏移地址 的格式,比如要查看1000:0 ~ 1000:9中的内容,可以用d 1000:0 9来实现
在这里插入图片描述
如果我们就想查看内存单元10000H中的内容,可以使用如下几种方法:
在这里插入图片描述

1.6 用Debug的E命令改写内存中的内容

可以使用E命令来改写内存中的内容,比如将内存1000:0 ~ 1000:9单元中的内容分别改写为0、1、2、3、4、5、6、7、8、9,可以用e 起始地址 数据 数据 ...的格式来进行
在这里插入图片描述
也可以一个一个修改
在这里插入图片描述
如上图,我们可以用输入地址后,按Enter键,一个一个输入想修改的内容,按空格进行间隔

也可以用E命令向内存单元中写入字符

在这里插入图片描述
也可以使用E命令向内存中写入字符串,比如:
在这里插入图片描述

那么我们如何向内存中写入机器码呢?机器码也是数据,所以也可以用E命令将机器码写入内存。比如我们要从内存1000:0单元开始写入这样一段机器码:

机器码对应汇编指令
b80100mov ax, 0001
b90200mov cx, 0002
01c8add ax, cx

在这里插入图片描述
但是如何查看写入或是内存中原有的机器码所对应的汇编指令呢?——U命令

比如可以用U命令将从1000:0开始的内存单元中的内容翻译为汇编指令,并显示出来,如图
在这里插入图片描述
那么如何去执行我们写入的机器指令呢?用debug的T命令可以执行一条或是多条指令,简单使用T命令,即可执行CS:IP指向的指令

在这里插入图片描述
上图所示,我们看到CS:IP指向的地方不是我们想要的地方,所以用r命令修改了CS和IP中的内容,使其指向1000:0
完成上述步骤后,我们就可以去执行T命令了

在这里插入图片描述
可以看到执行指令后,AX中的值发生了变化

1.7 用Debug中的A命令以汇编指令的形式在内存中写入机器指令

前面我们使用E命令写入机器指令,这样子做是很不方便的,最好能直接以汇编指令的形式写入指令,因此Debug提供了A命令,A命令使用方法如下图:

在这里插入图片描述
在光标闪烁处即可写入指令(按Enter键即可停止输入)
在这里插入图片描述
在使用A命令写入指令的时候,我们写入的是汇编指令,Debug将这些汇编指令翻译为对应的机器指令,然后将他们的机器码写入内存


二、使用Debug,将下面程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中的内容变化

在这里插入图片描述

解答过程:
在这里插入图片描述
在这里插入图片描述


三、将下面三条指令写入从2000:0开始的内存单元中,利用这三条指令计算2的8次方

mov ax, 1
add ax, ax
jmp 2000:0003

在这里插入图片描述

在这里插入图片描述


四、查看内存中的内容

PC机主板上的ROM中写有一个生产日期,在内存FFF00H ~ FFFFFH的某几个单元中,请找到这个生产日期并试图改变它

在这里插入图片描述
在这里插入图片描述
这里会发现修改不了ROM日期,ROM是只读存储器,只能读出无法写入信息。信息一旦写入后就固定下来,即使切断电源,信息也不会丢失。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值