注意观察图中,CS和IP的值:
CS:IP处的地址就是CPU当前要读取、执行的指令。
Debug还列出了CS:IP所指向的内存单元处所存放的机器码,并将它翻译成为汇编治指令。
图中,CS:IP所指向的内存单元为0AE1:0100,此处存放的机器码为 DF9989916,对应的汇编指令为:c++
FISTP WORD PTR [BX+DI+1689]
还能够用R命令来修改寄存器中的内容:翻译
(5)使用debug中的D命令查看内存中的内容。
咱们使用“D 段地址:偏移地址”的格式来查看某个内存中的内容。好比查看内存10000H中的内容,地址格式是1000:0,而后用"D 1000:0"列出1000:0处的内容:
使用“D 段地址+偏移地址”的格式,Debug将列出从指定内存单元开始的128个内存单元的内容。
好比,咱们运行命令“D 0AE1:0100”,结果如图所示:debug
解析:
使用D命令,Debug将输出三部分的内容:code
- 左边是每行的起始地址。
- 右边是每一个内存单元中的数据对应可显示的ASCII码字符。
- 中间部分是从指定地址开始的128个内存单元的内容,用16进制的格式输出,每行的输出从16的整数倍的地址开始,最多输出16个单元的内容。
注意每行的中间有一个“-”,将每行的输出分红两部分,这仅仅是为了便于查看。
咱们看到的内存中的内容,在不一样的计算机中是不同的,也可能每次用Debug看到的内容都不相同。
由于咱们用Debug看到的都是原来就在内存中的内容,这些内容受随时都有可能变化的系统环境的影响。内存
使用“D 1000:9”查看1000:9处的内容:
Debug从1000:9开始显示,一直到1000:88,一共是128个字节。第一行中的1000:0~1000:8的内容不显示。字符串
在使用“D 段地址:偏移地址”,以后,接着使用D命令,可列出后续的内容:bug
也能够指定D命令的查看范围:
D 段地址:起始偏移地址 结尾偏移地址。im
好比要看1000:0~1000:9中的内容:数据
(6)用Debug的E命令改写内存中的内容。img
将内存1000:0~1000:9单元中的内分别写为0,1,2,3,4,5,6,7,8,9,能够用“E 起始地址 数据 数据 数据…………”的格式来进行;
用E命令向内存中写入字符,好比:用E命令从内存1000:0开始写入:一、“a” 、二、“b”、三、“c”。结果以下:
用E命令向内存中写入字符串,好比,用E命令从内存1000:0开始写入:一、”a+b“、二、”c++“、三、”IBM“。结果以下:
(7)用E命令向内存中写入机器码,用U命令查看内存中机器码的含义,用T命令执行内存中的机器码。
从内存1000:0单元开始写入这样一段机器码:
mov ax,0001 //机器码:b80100 mov cx,0002 // 机器码:b90200 add ax,cx //机器码:01c8
**咱们能够用U命令查看咱们写入内存的或内存中原有的机器码所对应的机器指令
用U命令将从1000:0开始的内存单元中的内容翻译为汇编指令,并显示出来。U命令的显示输出分为3部分:每一条机器指令的地址、机器指令、机器指令所对应的汇编指令。
咱们能够看到,内存中的数据和代码没有任何区别。关键在于如何解释。
用debug的T命令能够执行一条或多条指令,简单地使用T命令,能够执行CS:IP指向的指令。要使用T命令执行写到1000:0的指令,有以下两个步骤:
- 先让CS:IP指向1000:0
- 用R命令修改CS、IP中的内容,使CS:IP指向1000:0
- 使用T命令执行咱们写入的指令(此时,CS:IP指向咱们的指令所在的内存单元)
- 执行T命令后,CPU执行CS:IP所指向的指令,则1000:0处的指令B8 01 00(mov ax,0001)获得执行,指令执行后,debug显示输出CPU中寄存器的状态。
指令执行后,AX中的内容被改写为1,IP变为IP+3(由于mov ax,ooo1的指令长度为3个字节),CS:IP指向下一条指令。
咱们能够继续用T命令向下执行指令:
(8)用debug的A命令以汇编指令的形式在内存中写入机器指令。
能够看到,在使用A命令写入指令时,咱们输入的是汇编指令,Debug将这些汇编指令翻译为对应的机器指令,将它们的机器码写入内存。
本次实验中须要用到的命令
- 查看、修改CPU中寄存器的内容:R命令
- 查看内存中的内容:D命令
- 修改内存中的内容:E命令(能够写入数据、指令,在内存中,它们实际上没有区别)
- 将内存中的内容解释为机器指令和对应的汇编指令:U命令
- 执行CS:IP指向的内存单元处的指令:T命令
- 以汇编指令的形式向内存中写入指令:A命令