【汇编】CPU的大小端存储模式

发布于:2023-01-04 ⋅ 阅读:(452) ⋅ 点赞:(0)

前言:本文章是基于汇编来介绍cpu的大小端存储模式,使用到的软件是DTDEBUG,网上很多地方都有资源,所以就不介绍了,下面以32位汇编来介绍什么是cpu的大小端模式。

1、为什么会有大小端之分?

        首先,在我们的计算机中,是以字节为单位的,每一个存储单元对应一个字节,一个字节8个bit位,也就是只能存储8个0和1,或者存储两位的十六进制数。

        但是,在我们的C语言中,不仅仅只有8bit的char型,还有16bit的short型以及32bit的int型,那么如果我们用int定义一个4字节的数字,存放在一个内存单元(1字节)中,是放不下的。那么怎么办呢?计算机的内存会以大端或小端模式将四个字节的数字存入给内存连续的四个存储单元。

2、什么是cpu的大小端模式?

       大端模式: 是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。

        

        小端模式: 是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。

        内存的高低地址:一个32位的进程会占用4个G的内存空间,这里说的内存是逻辑上的,也就是虚拟的。并不是物理上的内存空间,当然也不是内存条。(至于32位的进程为什么会占用4G内存,这个以后我会继续发表文章)内存地址是连续的,从0x00000000到0xFFFFFFFF,那么0x00000000就是低地址,0x00000001就是高地址。

        数据的高低字节:假设你有1200块钱,它分为千、百、十、个位,那么千位就是高位,个位就是低位,我们的数据就是这样。

3、如何判断cpu是大端还是小端?

        做一个测试就知道了。

示例:   

        假设我们需要存的数字是0x11223344(4字节),存储的(首)地址是0x00CFFF40。

        大端模式下:

                0x00CFFF40存储的是0x11

                0x00CFFF41存储的是0x22

                0x00CFFF42存储的是0x33

                0x00CFFF43存储的是0x44

        小端模式下:

                0x00CFFF40存储的是0x44

                0x00CFFF41存储的是0x33

                0x00CFFF42存储的是0x22

                0x00CFFF43存储的是0x11

验证:

        使用DTDEBUG将0x11223344存入地址0x00CFFF40(这个地址,最好是已经申请好了可以使用的堆栈)。

         注意:0x00CFFF40是我这里已经申请的可用内存。

        使用如下命令将0x11223344存入地址0x00CFFF40:

MOV DWORD PTR DS:[0x00CFFF40],0x11223344

        按F8执行。 

        可以看到0x00CFFF40存放了0x11223344

        到了这里肯定有人会说“那这不就是大端模式了吗?”

        其实并不是。

        原因:我们可能会觉得0xCFFF40存放了11,41存放了22,42存放了33,43存放了44。其实并不是这样的,这个窗口是以32位来观看的,也就是说它只能保证从CFFF40到CFFF44这四个字节存放了0x11223344,不能保证40存放的是11。换句话说:0xCFFF40没准存放的是44,41存放的是33。

        为了验证上面这一说法,我们可以使用内存窗口,一个字节一个字节的观看,而不是在堆栈窗口以四个字节四个字节观看。

        使用如下命令,可以单个字节的观看内存0x00CFFF40:

        

db 0x00CFFF40

        可以看到40(低地址)存放的44(低字节):小端

 

         所以上面使用的是小端模式。

        总结:想要知道知道自己的cpu是大端存储模式还是小端存储模式,写个程序测试一下就行了。

本文含有隐藏内容,请 开通VIP 后查看