6行代码领略C/C++学习的乐趣 ——剖析赋值语句的机器码

调试程序

int gi;
int main()
{
	gi = 0xffffffff;
	return 0;
}

在第4行打断点

调试 ---> 窗口 ---> 反汇编;或者是alt + 8快捷键;

此时此刻,你一定可以看到反汇编代码。

现在,点击右键,把红色方框的全部选择;就可以看到C语言中无法看到的信息了。

接着我们来分析一下关键的代码和符号。如图所示的1 2 3


此时此刻,我们应该会产生3个问题:

  1. C7 05代表什么意思?

  2. 内存地址00EFA138h,到底代表什么意思?它真的是变量gi的地址值吗?

  3. Mov指令的地址是什么?是不是这个00EF1728呢?

 

不用着急,我先带着大家来个个击破 。


第1个问题,C7 05 其实就是mov指令的机器码,这个大家应该都知道,在这里不做赘述。


接着,我们再来研究第3个问题。

0x00EF1728到底是不是mov指令的地址?我们按照如下步骤操作:

调试 ---> 内存 ---> 内存1

把0x00EF1728拷贝到该窗口,从下面的窗口我们就确确实实看到了C7 05。

这也进一步验证了我们的想法。


接着,我们再回过头来看第2个问题:内存地址00EFA138h到底代表什么意思?

那么,先按照以下步骤操作:

1 调试 ---》 2 监视---》 3 监视1

然后,把gi变量和&gi拷贝到窗口。

大家可以看到,0X00EFA138h确确实实是变量gi的地址值。

我们按F11逐语句继续运行。

这时,我们可以看到gi的值变成了0Xffffffff。

好的,这样就再一次验证了我们的猜想。


在这里,我们还可以从另一个角度出发,来佐证我们的猜想:

1 重新运行程序,触发断点;

2 我们还是把内存监控的窗口调出来,在程序没有运行到gi = 0xffffffff之前,我们修改内存里面的值。

具体修改方法是:右键-->编辑值;

大家可以看到值变成了红色字体显示的00000001,这是我手动修改的。

接着按下F11,发现了吗?我改了内存里面的值;

就算运行了gi = 0xffffffff;我们监控的gi的值却变为了1;而不是0xffffffff;

所以,再一次验证了我们的猜想:这个地址确实是 gi的地址。


panda胖胖秦小结:

1、C/C++的调试环境,确实比较好玩,尤其是调试环境的反汇编、监视窗口、内存窗口、单步、断点、mov 指令、全局变量赋值的反汇编,它们对指令建立了形象的认知,并直接构建了指令,直接改变了内存的值。

2、调试学习过程,就是我们探索式学习很好的一个方法,它由由浅及深的三阶段组成∶深入剖析 → 部分修改 → 全新构建。我们要善于将自己的探索过程分解为:假设 ---》 实证 ---》 推进;通过这样的过程,锻炼到我们对调试学习的理解力;同时,我们的分析能力和逻辑推理都会更上一层楼。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值