汇编数据宽度和字节序


本文整理自网络,侵删。

 

数据的宽度

数据的宽度是指数据在存储器中存储的尺寸。在计算机中,所有数据的基本存储单位都是字节(byte),每个字节占8个位(位是计算机存储的最小单位,而不是基本单位,因为在存储数据时几乎没有按位进行存储的)。其他的存储单位还有字(word)、双字(dword)和八字节(qword)。

在计算机编程中,常用的几个重要数据存储单位分别就是byte、word和dword,这几个存储单位。

单位所占位数所占字节数
字节(byte)8位1字节
字(word)16位2字节
双字(dword)32位4字节
八字节(qword)64位8字节

数值的表示范围

在计算机中存储数值时,也是要依据前面的数据宽度进行存储的,那么在存储数据时由于存储数据的宽度限制,数值的表示也是有范围限制的。那么byte、word 和dword能存储多少数据呢?我们先来计算一下,如果按位存储的话,能存储多少个数据,再分别来计算以上三种单位能够存储的数值的范围。

计算机使用二进制进行数据存储时,一位二进制最多能表示几个数呢?因为是二进制数,只存在0和1两个数,所以一位二进制数最多能表示两个数,分别是0和1。那么,两位二进制最多能表示几个数呢?因为一位二进制数能表示两个数,所以两位二进制数则能表示2的2次方个数,即4个数,分别是0、1、10、11。进一步地,三位二进制数能表示的就是2的3次方个数,即8个数,分别是0、1、10、11、100、101、110、111。

存储单位十进制范围十六进制范围2的N次方
字节(byte)0-2550-FF2的8次方
字(word)0-655350-FFFF2的16次方
双字(dword)0-42949672950-FFFFFFFF2的32次方

2的8次方是256,为什么数值只有0~255个呢?因为计算机计数是从0开始,从0到255同样是256个数,这里的2的8次方表示能够表示数值的个数,而不是能够表示数值的最大的数。
这里只给出了无符号整数的表示范围,那么什么是无符号呢?数值分为有符号数和无符号数,有符号数是分整数和负数的,而无符号数值有整数没有负数。负数在计算机中的表示有符号数时借助了最高位来进行,如果最高位是0,那么就是整数,如果最高位是1则是负数。关于有符号数和无符号数不必过多地纠结,因为计算机表示数据是不区分有符号还是无符号的,有符号还是无符号是人在进行区分。

有符号数和无符号数

数学中的数据分为正数和负数,在计算机中我们分为无符号数和有符号数,无符号数表示全是正数,有符号数表示有正数和负数。这里好比将容器贴个标签,将它贴上“无符号数”的标签,那么它里面都是正数。如果它的标签是“有符号数”,那么它里面的数据可能是正数也是负数。它里面的电路数量是一定的,它能表示的开关组合也是一定的,那么它到底是按无符号数看还是有符号数看,关键在于它标签是什么。

如下图,数据宽度为4的容器能存储的数据转换为十六进制为“0~F”,使用一个圆球表示

无符号数表示范围:0?1?2?3?4?5?6?7?8?9?A?B?C?D?E?F,箭头方向表示增加方向?有符号数:
正数表示范围:0?1?2?3?4?5?6?7

负数表示范围:-1?-2?-3?-4?-5?-6?-7?-8(从半圆F起到8,所以F表示-1,8表示-8)

无符号数不难理解,而有符号数则是从中间一分为二,左边为负数,右边为正数。同一个圆把它看成无符号数它是一个正数,如果把它看成是有符号数则是有正有负。比如F,它如果是无符号数,就是15,如果是有符号数它就是-1。

字节序

字节序也称为字节顺序,在计算机中对数值的存储有一定的标准,而该标准随着系统架构的不同而不同。了解字节存储顺序对于逆向工程是一项基础知识,在动态分析程序的时候,往往需要观察内存数据的变化情况,这就需要我们在掌握数据的存储宽度、范围之后,进一步了解字节顺序。

通常情况下,数值在内存中存储的方式有两种,一种是大尾方式,另一种是小尾方式。关于字节序的知识,通过一个简单的例子就可以掌握。

比如有0x01020304(C语言中对十六进制数的表示方式)这样一个数值,如果用大尾方式存储,其存储方式为01020304,而用小尾方式进行存储则是04030201,用更直观的方式展示其区别,如表所列。

大尾方式小尾方式
数据地址值数据地址值
0100000000H0400000000H
0200000001H0300000001H
0300000002H0200000002H
0400000003H0100000003H

从两个地址列可以看出,地址的值都是一定的,没有变化,而数据的存储顺序却是不相同的。从表中可以得到如下结论。

大尾存储方式:内存高位地址存放数据低位字节数据,内存低位地址存放数据高位字节数据;

小尾存储方式:内存高位地址存放数据高位字节数据,内存低位地进存放数据低位字节数据。

通常情况下,Windows操作系统兼容的CPU为小尾存储方式,而Unix操作系统兼容的CPU多为大尾存储方式。在网络中传输的数据的字节顺序使用的是大尾存储方式。

相关阅读 >>

Delphi 通过机器名读取ip地址的代码

winapi 字符及字符串函数(2): charlowerbuff - 把缓冲区中指定数目的字符转小写

Delphi获得webbrowser中的html文本

Delphi搜索字符串在流中的位置

Delphi 得到 winrar 处理解压缩文件的返回值 ?

Delphi ios取设备唯一值

Delphi中的record怎么动态分配内存?

Delphi listview1 加载文件列表用法

Delphi 如何从dll中检索导出函数的列表

Delphi修改资源文件的代码

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...