Debug的使用
①R命令,查看和改变cpu寄存器的值
这是模拟8086的cpu环境,可以看到有AX,BX,CX,DX,CS,IP
CS,IP指向的位置就是要执行指令的位置
最后一行的参数就是指向命令的详情
修改某个寄存器的值[R 寄存器]
修改IP的值
R IP
Notes:不是直接[R cs 参数],并且不分大小写
②D命令,查看内存中的内容
- 先看看进制转换,7F转换成十进制
- 查看内存10000 的内容,D 段地址:偏移地址,D 1000:0,
Debug会列出从查询地址开始的128个内存单元(一个内存单元一个字节),即列出了,10000 ~ 1007F的值,每一行的数据从十进制16的整数倍开始
左边的是每行的内存起止地址,cs:ip式的
第一行的内容所在内存1000:0 ~ 1000:F,为什么中间有十六个数据,因为0~F用十进制代表有16个,即有16个内存单元.而一个内存单元占一个字节(byte),一个字节八位,一位只能表示0或1,所以最大值 1111,1111=255D=
FFH,最大值用16进制表示就是FF每个内存单元,所以看到的中间的数据也是两位数的.中间的 ‘-’ 号为了方便查询数据,介于第八个和第九个之间
右边的是对应的ASCALL码,46对应的ASCALL码就是F,没有的用 . 代替
再来测测 D 1000:1
可以看到还是显示128个数据,还是从16的倍数开始,不在范围的就不显示
连续输入 D 命令查看后续的128个数据,一进入输入D命令查看的是Debug初始的
命令D CS:IPstart IPend/IPStart 指定查看位置与某个位置
例如 D 1000:0 9,不再多述
③E命令,改变内存的内容
- E CS:IP 数据1,数据2……
E CS:IP 一个一个修改
E CS:IP ‘A’ 插入字符 或者 “ABC” 插入字符串
E命令将机器码写入内存
机器码 汇编指令 b80100 mov ax,0001 b90200 mov cx,0002 10cb add ax,cx
③用 U命令查看所在内存的汇编形式 U CS:IP
- 前面三个指令,第一和第二都各占3个字节,第三个占2个字节,
- 计算机怎么知道多少个字节的数据代表什么指令???
④用T命令执行内存所对应的汇编指令
- 1,把汇编指令对应的机器码写入内存,用E命令 e 1000:0 b8 01 00 b9 02 00 10 cb
- 2,将CS,IP的值指向汇编指令起始地址,用R命令 r cs —> 1000 r ip —> 0
- 3,执行T指令
- 执行 mov ax,0001后,ax寄存器的值变为了0001,但是第二条语句mov cx,0002并没有执行,
并且 IP的值 + (mov ax,0001)的指令所占字节大小,即+3,变成了IP=0003 - IP的值自动增加,现在再次执行 T 命令
可以看到IP的值有加上了前一条指令(mov cx,0002)所占大小即+3,变成了IP=0006
⑤A命令,以汇编形式将数据写入内存
- A CS:IP 然后一个一个输入汇编指令
- 遇到了插入汇编回车时报错,重启Debug后又没问题了,可以看到数据插入成功了