环境为VS2022,Debug版本-x86
//明天再摸一会
再摸几天,突然发现这里面我不会的挺多的
0 说在前面
本文章中的代码严重依赖环境(主要是x86条件),选用debug(调试)的版本是因为多数调试版本下的编译器或解释器不会自动优化代码。
1 x86是什么?一种指令集架构
x86可以指代8位、16位、32位的指令集架构,目前主要指代32位的指令集架构,其中包含寄存器、寻址模式、存储体系等重要的计算机体系结构。
32位指的是32bit,即4个字节(Byte),1个字节8位(bit,也称比特)。具体是指其包含的8个32位的通用寄存器(IA32):EAX、EBX、ECX、EDX、ESP、EBP、ESI、EDI。
而cpu从内存中查找数据(寻址)时,是以字节为单位查找的,即cpu中的一个地址就对应着内存中的1个字节(8个位),而cpu自己能表示的地址数受限于寄存器位数,至多表示
2
32
2^{32}
232个地址,故32位cpu能使用的内存最大不超过
2
32
∗
2
3
=
2
35
2^{32} * 2^{3} = 2^{35}
232∗23=235个位空间,也就是4GB空间了。这个问题在64位处理器里得到了解决,理由就是对于现在而言,
2
64
+
3
2^{64+3}
264+3足够大了。(也许以后128乃至更多才是主流?)
另外,这里cpu对应的寄存器的位只是用于寻址功能,所以其实际容量并不大,只是其能表示的数字大而已,而内存则是实打实的从0000到1111都有空间的。
而如果将上述的内存空间原原本本地展开,会非常难看,所以稍后在内存监视窗口中,我们所看见的是两个数字一组表示的1个字节,当然,此时的这两个数字是十六进制的(1个十六进制数字可以展开为至多4个二进制数的组合,比如1100 0001 == C1, 这里是8个二进制数,也就是8bit,即1个字节)。
2 变量在内存中的存储
局部变量和全局变量为何不同?
2.1 如何使用监视器和内存工具寻找变量的位置?
首先使用F9在你希望停下的位置打下一个断点,告诉程序:“待会我调试的时候你要配合我,走到这里就立定,别动,我说之后怎么动,你再照着做。”
然后使用F5开始调试,按下F5之后,断点所在行前面的代码没啥问题的情况下,程序运行会停在断点所在行(此行尚未运行)。
(例子等我明天摸一个)