计算机和人(二)我从dos的debug起步

懂得并熟练用汇编来为自己工作,那我就是CPU的用户。

因为CPU厂商有很多,CPU的指令集就有很多,那么汇编就有很多种?

也许是的,但大多是一通百通,我们从dos的debug起步吧,捉住本质才是最重要的。

进入ms-dos程序界面,也就是win系统敲入cmd。然后敲入debug,初来咋到,什么都不知道,只有一个—,敲入?

debug问号

? 显示 Debug 命令列表。
a 汇编 8086/8087/8088 记忆码。
c 比较内存的两个部分。
d 显示部分内存的内容。
e 从指定地址开始,将数据输入到内存。
f 使用指定值填充一段内存。
g 运行在内存中的可执行文件。
h 执行十六进制运算。
i 显示来自特定端口的 1 字节值。
l 将文件或磁盘扇区内容加载到内存。
m 复制内存块中的内容
/n 为 l 或 w 命令指定文件,或者指定正在测试的文件的参数。
o 向输出端口发送 1 个字节的值。
p 执行循环、重复的字符串指令、软件中断或子例程。
q 停止 Debug 会话。
r 显示或改变一个或多个寄存器。
s 在部分内存中搜索一个或多个字节值的模式。
t 执行一条指令,然后显示所有寄存器的内容、所有标志的状态和 Debug 下一步要执行的指令的解码形式。
u 反汇编字节并显示相应的原语句。
w 将被测试文件写入磁盘。
xa 分配扩展内存。
xd 释放扩展内存。
xm 映射扩展内存页。
xs 显示扩展内存的状态。

敲入?号之后我们获得了帮助,可是有时候这些帮助来的那么无力,因为我们看了之后还是不太懂,那么,我想说的还是懂点英语的,d--dump,有的人说是显示,那我就当做显示吧,遵守不懂的情况下,先看看后想想再做做的原则,我就敲入了d

d命令

这是默认内存地址的内容。一共显示了8行,每行16个字节,左边为内存地址范围,中间为每个内存的内容(16进制表示),右边为对应的ASCII,不可显示的ASCII字符用.代替。

内存地址显示的是段地址:偏移地址(严格来说,如果地址没有偏移的,只有一个数值的话,那么说的是指针地址指向的基地址)

我们可以看到ASCII表里s对照的是73,事实上,我们可以在ASCII表里找到上面右边可显示部分对应的值(HEX值)。

注:ASCII表很好,不知该怎么用的人,那么我是无话可说的。

不断敲打D,我们会发现内容不断变化,偏移地址段也向后更新。不过这不是我们想要的,如果我们想要到1000的地方看风景呢

d地址

看起来还是很迷茫,不过初步认识了d 段地址(0b5d):偏移地址(1000),我能看到想看到的地址内容。

其实我有点想吐槽,只能看128个字节的死模板让我狠不爽,我能不能只看一个字,比如只看偏移地址1000

看上图中,d 段地址(0b3d):起始偏移地址(1000)+空格+结束偏移地址(1000)就锁定了一个字节的数据

如果起始(1000)到结束(1010),那就是锁定了17个字节,那就是因为16进制的原因。00到0f是16个字节,10是16+1进位了。

我们能看了,现在要做的是想想自己要做什么?我们学习了寄存器(registers)有多少寄存器呢?呵呵,好像有点多,那我们去看寄存器?不是,我想看汇编,然后向内存写些东东。好吧,现在开始我们需要了解e,u,r。

r 显示或改变一个或多个寄存器。

敲入r,显示了许多寄存器,希望改变基地址寄存器BX的值为0110,好的,如下图一样的干活。

我以为架起来的是大炮,可是打出去的是激光束,精准地只改变了BX=0110,其他的都没有改变,如果我把指令指针ip改了呢

老大,你叫我打哪,我就打哪,你叫我去0010的地方搞事,我带着兄弟一起跑哪里去,因为你厉害,你指哪我打哪。哈哈,指令指针有点当将军的命,除了地址改了,我们捉住当地的代码。

u 反汇编字节并显示相应的原语句。

我用u看到不该看到的东东,你说呢?内存--机器码---汇编语言,看到汇编语言,感觉离真相越来越近了。

其实离我们所需要的只进了一小步,离目标还很远,但我高兴。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值