汇编语言(3):Debug调试
今天看完第二章,学习了主要的实验:汇编调试,用来查看机器码,汇编语言,以及CS:IP地址之间的关联。
一般我们在查看CS:IP指向的内存,然后在CS:IP指向的内存中写入一定内存的机器码转成汇编或者是直接写入汇编指令。
先来说一下调试实验用的工具:debug.exe.是汇编语言书上说的,但是WINDOWS7及以上的系统削减了debug,导致我们没法在dos命令中直接Debug,我们要获取一个环境
1.安装windows2000server虚拟机
2.这个方法比较简单,就是下载一个dosbox,直接去网上搜,按照默认路径下载,我也附上下载地址:
https://files.cnblogs.com/files/ECJTUACM-873284962/DOSBox0.74-win32-installer.rar
然后下载Debug.exe32位程序,附上下载地址
https://files.cnblogs.com/files/ECJTUACM-873284962/DEBUG.zip
下载好之后,打开dosbox然后输入
1 | mount c debug.exe的安装地址 |
即可完成挂在。然后直接输入 c:
它的意义就是dosbox应该在C盘中执行命令,这里把debug.exe所在文件夹当作C盘,直接可以执行debug.exe
我们打开程序debug
1 | -r用来查看各寄存器中的指令。 |
寄存器中存的是地址,也就是内存的位置,要到内存中去读取具体数据,也就是读取命令,我们用
1 | -d来查看具体内存中的数据,指令。 |
我们并未指定内存地址,所以它随机返回了一组内存单元的内容,我们可以指定:
我们可以用
1 | -d 初始地址比如0000:0010 |
它会自动返回一个长位128Byte的机器码如中间的输出,最右边的输出是机器码转换为ASCII码之后的值。
我们发现右边都是点或者不可见字符转换而来的,应该是相应内存单元没有字符串类指令,如果在机器指令处输入数字,转换成ASCII很容易是不可见的,也就是…点。
刚才说的 r 还能用来改写CS:IP中的指向,也就是改写寄存器中的地址。可以直接执行我们所改地址中的指令。
例如:
我们修改了AX寄存器中的内存地址,由0000变为1111,但是CPU执行指令是执行CS:IP中的地址,所以我们可以尝试修改CS:IP
一开始的CS:IP是073F:0100,寄存器里面存的值问0001,
我们修改为段地址不动,段地址就是CS代表的地址,IP为偏移地址,改为0200H
发现修改了指向地址,取出的指令也就不同了。
下面继续来看 -d指令,它还有几种看内存数据的方式
1 | d 1000:9 |
也就是起始偏移地址从9开始,如图中间的机器码是第九位,也就是从中间开始,然后输出128 Byte结束。
或者可以先给出初始地址,然后给出结尾地址,直接可以打印出之间的所有内存
但是注意格式
1 | -d 1000:0000 0009 |
最后面的就只写偏移地址,也就是说最多从0000打印到ffff也就是多少位?
也就是hex(10000)位即16……4 = 65536个内存。
下面用E来改写
第一种方法,直接对应地址写入数据
我们看到按照地址次序成功被写入内存,称为十六进制机器码。
第二种方法,先进入这个地址,然后用提问的方式,一个一个写:
在点后面输入添加的内容。
输入完一个内存的数据就敲space最后都输入完回车即可。
如果键入字符串,会把字符串转换为ASC码放到内存中当作机器码:
注意我犯了错误,是键入字符串,要用单引号包裹,如果键入字母,一样会被直接写入机器码。
特别注意必须要用第一种键入方式,一次性都键入再执行,因为第二种方式键入时不能打引号,无法形成字符串。
确实将ASC码放入机器码中,在右边的 ASCII码输出中输出了字符!
下面我们写入特定的机器码,能让其翻译成成句的汇编语句。
如何看翻译出来的汇编结果呢,需要参数U
成功翻译成了我们想要的指令!
如何来执行呢?用新的参数T
应该先让R修改CS:IP到我们添加指令的地址!
成功执行了 mov ax,0001
后面显示的 MOV CX,0002代表IP +3之后的指令
如图,此时IP正好位0013.
再次执行后看到IP变成0016,指向最后一条ADD指令。
下面提供直接写入汇编指令的方式,比先用E写入机器码再用U转码要容易
用A指令
如图键入即可。
下面看一个实验练习:
我们敲在编译器中,先用A写入内存,再用R查看到CS:IP的地址,逐条执行。
可以看到AX,BX的值确实按照预期变化。
下面做最后一个练习:利用如下指令计算2的3次方:
1 | mov ax,1 |
看图我就不多说啦,迭代两次很容易理解!