计算机内存只有5种表现形式(计算机内存被划分为什么)

生活常识 2023-05-15 19:40生活常识www.xinxueguanw.cn

32位寄存器更大多少 计算机内存地址只有5种表现形式吗,为什么?

了解了内存的知识,也知道内存的使用 ,那内存是内存条吗?答案是否定的,内存是暂时存储程序以及数据的地方。那内存有什么作用哪?大家都知道是存数据的。

上节中介绍了如何对内存读写,例如把一块内存地址[0x12345678]的数据存到另一块内存地址为[0x87654321]中去,用MOV指令实现。

MOV EAX ,DWORD PTR DS:[0x12345678]

MOV DWORD PTR DS:[0x87654321],EAX

我们从答案中可以得出,内存地址是一些数值编号组成的,难道内存地址只有这一种表现形式吗?我们在调试程序的时候还会碰到其它的表现形式吗?我们在调试程序时,内存地址不止这一种表现形式,还有其它的表现形式,共分为五种。

2.6.1【内存地址的五种表现形式】

之一种形式[立即数]

读取内存的值

MOV EAX,DWORD PTR DS:[0x003EF8CC]

之一步确定宽度DWORD表示宽度为四个字节,EAX寄存器为32位寄存器,0x003EF8CC是已经申请的内存。看图2-6-1中,此时EAX寄存器存储的数据为0x001D2BA2

第二步按F8观察EAX寄存器存储的数据有什么变化,,如图2-6-2所示,看到EAX寄存器存储的数据正是内存地址0x3EF8CC里面存储的数据。

向内存中写入数据

MOV DWORD PTR DS:[0x003EF8D0],ECX

之一步确定宽度DWORD表示宽度为四个字节,ECX寄存器为32位寄存器,0x003EF8D0是已经申请的内存,看图2-6-3中,ECX存储的数据为0x0000000,内存地址0x03EF8D0存储的数据是001D2BA2;

第二步按F8观察内存地址0x003EF8D0存储的数据的变化,如图2-6-4所示,

看到内存地址0x003EF8CC里面存储的数据正是ECX寄存器里面存储的数据。

第二种形式[register]

register代表通用寄存器,可以是8个通用寄存器中任意一个,表示该寄存器中储存的数据为内存地址。我们程序运行的时候,通常将基址保存在寄存器中。这里只能使用这8个32位通用寄存器,因为内存地址编号是32位。

读取内存中的值

MOV ECX,0x002FFE18

MOV EAX, DWORD PTR DS:[ECX]

之一步将指令MOV ECX,0x002FFE18 写入汇编窗口,如图2-6-5,记住当前ECX寄存器存储的数据为0x11111111。

第二步按F8观察,是否把内存地址0x002FFE18写入ECX中,如图2-6-6所示

第三步将指令MOV EAX, DWORD PTR DS:[ECX]写入汇编窗口,如图2-6-7所示

第四步按F8观察,是否把ECX存储的内存地址对应的数据写入EAX中,如图2-6-8所示:

向内存中写入数据

MOV EDX,0x002FFE1C

MOV DWORD PTR DS:[EDX],0x123456

之一步将指令输入到汇编窗口

第二步按F8观察,把内存地址0x002FFE1C写入EDX中,看图2-6-10

第三步按F8观察,把立即数0x00123456写入EDX中,看图2-6-11

第三种形式[register+立即数]

读取内存中的值

MOV ECX,0x003FF9E4

MOV EAX, DWORD PTR DS:[ECX+4]

之一步输入指令,看图2-6-12所示

第二步按F8观察,把内存地址0x003FF9E4写入ECX中,看图2-6-13

第三步按F8观察,把[ECX+4](0X003FF9E4+4)存储的数据写入EAX中,看图2-6-14

向内存中写入数据

MOV EDX,0x002EFA50

MOV DWORD PTR DS:[EDX+0xC],0x123456

之一步输入指令;

第二步按F8观察,把内存地址0x002EFA50写入EDX中;

第二步按F8观察,把立即数0x00123456写入[EDX+0xC](0x002EFA50+0xC)中。

第四种形式[register+register{1,2,4,8}]

1、2、4、8我们称为比例因子(Scale Factor)。【有兴趣需要深入了解可以查阅Intel白皮书相关内容】

读取内存的值

MOV EAX,0x0012FFC4

MOV ECX,0x2

MOV EDX,DWORD PTR DS:[EAX+ECX4]

之一步输入指令;

第二步按F8观察,把内存地址0x0012FFC4 写入EAX中;

第三步按F8观察,把立即数0x2(0x00000002)写入ECX中;

第四步按F8观察,把[EAX+ECX4](0x12FFC4+0x24)的值写入EDX中;

表示将2放入宽度为4字节(DWORD),内存地址为0x12FFC4+24即0x12FFCC中。

向内存中写入数据

MOV EAX,0x12FFC4

MOV ECX,0x2

MOV DWORD PTR DS:[EAX+ECX4],0x12345678

之一步输入指令;

第二步按F8观察,把内存地址0x0012FFC4 写入EAX中;

第三步按F8观察,把立即数0x2(0x00000002)写入ECX中;

第四步按F8观察,把立即数0x12345678写入[EAX+ECX4](0x0012FFC4+0x24)中。

第五种形式[register+register{1,2,4,8}+立即数]

读取内存的值

MOV EAX,0x0012FFC4

MOV ECX,0x2

MOV EDX,DWORD PTR DS:[EAX+ECX4+1]

之一步输入指令;

第二步按F8观察,把内存地址0x0012FFC4 写入EAX中;

第三步按F8观察,把立即数0x2(0x00000002)写入ECX中;

第四步按F8观察,把[EAX+ECX4+1](0x0012FFC4+0x24+1)写入EDX中。

向内存中写入数据

MOV EAX,0x0012FFC4

MOV ECX,0x2

MOV DWORD PTR DS:[EAX+ECX4+1],EDX

之一步把内存地址0x0012FFC4 写入EAX中;

第二步把立即数0x2(0x00000002)写入ECX中;

第三步把EDX的数据写入[EAX+ECX4+1](0x0012FFC4+0x24+1)中。

每一种地址形式都是有意义的,目前内存地址只有这五种形式,这五钟形式的通用格式为[register+register数+立即数]。

肯定会有人问为什么只有五种表示 ,而且比例因子只能是1,2,4,8哪?极有可能的原因是(猜测)计算机只识别机器语言,所以我们要将内存地址的表示 翻译成机器语言才能得到执行。组合越多,翻译起来越麻烦,cpu的技术员们只好订个规矩只能使用五种表示 ,否则一律不识别。【有兴趣需要深入了解可以查阅Intel白皮书相关内容】

1、如果我们所加的立即数为0xFFFFFFFF,那么运算结果极有可能会超过32位0xFFFFFFFF这个范围,计算机限宽,只会保留运算后32位。

2、如果乘的比例因子为0 的情况下,那么计算机会自动把0忽略,虽然运行结果与乘的比例因子1的结果一样,它是错误的运行结果。

3、切记比例因子只能是1、2、4、8。

思考一下如果算出的内存地址结果超过32位会怎样?

,如果你想学C/C++可以私信心血管健康网小编“01”获取素材资料以及开发工具和听课权限哦!

计算机内存被划分为什么 如何分配计算机内存地址

Copyright@2015-2025 www.xinxueguanw.cn 心血管健康网版板所有