搜索
写经验 领红包
 > 时尚

赋值代码(赋值语句规则)

导语:剖析赋值语句的机器码-调试程序

易道云出品

调试程序:

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呢?

好的我们先回答第一个问题 C7 05 其实就是mov指令的机器码。这个大家应该都知道。

接着我们先来研究第三个问题,0x00EF1728到底是不是mov指令的地址,我们按照如下步骤。

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

易道云出品

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

所以验证了我们的想法。

易道云出品

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

首先按照下面步骤:1 调试 ---》 2 监视---》 3 监视1

易道云出品

然后把gi变量和&gi拷贝到窗口,大家可以看到,0X00EFA138h确确实实是变量gi的地址值。

易道云出品

我们按F11逐语句继续运行,可以看到gi的值变成了0Xffffffff,验证了我们的猜想。

易道云出品

我们还可以从另外的角度来佐证我们的猜想;

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

我们还是把内存监控的窗口调出来,在程序没有运行到gi = 0xffffffff之前;

我们就修改内存里面的值,具体修改方法如下,右键-->编辑值。

易道云出品

大家可以看到值变为了红色这块的00000001,这是我手动修改的。

易道云出品

接着按下F11,发现了,我改了内存里面的值,就算运行了gi = 0xffffffff;

我们监控的gi的值却变为了1,而不是0xffffffff;

所以再一次验证了我们的猜想。

易道云出品

这个地址确实是 gi的地址。

总结:

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

2、调试学习过程就是我们探索式学习很好的例子,分为由浅及深的三阶段∶深入剖析 → 部分修改 → 全新构建。我们要善于将自己的探索过程分解为:假设 ---》 实证 ---》 推进,这样子的过程。通过这样子的锻炼,我们的分析能力会更上一层楼。

免责声明:本站部份内容由优秀作者和原创用户编辑投稿,本站仅提供存储服务,不拥有所有权,不承担法律责任。若涉嫌侵权/违法的,请反馈,一经查实立刻删除内容。本文内容由快快网络小媛创作整理编辑!