`

x86基础之数与数据类型

阅读更多

我们知道在计算机中处理的数是按照一定的规则进行组织和存放的。其中的每个数按特定的编码规则组织。可是光有这些数的组织规则还是不够,计算机每条指令的操作数可能会有不同的数据类型。那么计算机能处理哪些数据类型呢?在这一章里,我们将要了解数与数据类型。

计算机能处理各种各样的信息,计算机硬件对数据进行处理后,可呈现出各种各样的信息。

数字

数字是个基本的计数符号。通用的数字有10个:0123456789。以这些数字组合构成的数是十进制数。

思考各个进制数的数字。

1.二进制数字

包括01

2.八进制数字

包括01234567

3.十进制数字

包括0123456789

4.十六进制数字

包括0123456789及字母ABCDEF

各个进制以相应的数字表达的计数范围作为base值,如:二进制的base值是2,八进制的base值是8,十进制的base值是10,十六进制的base值是16

二进制数

二进制数是计算机运算的基础,无论何种制式的数,在计算机中都是以二进制形式存放的。由二进制数字组成的数字序列是二进制数,如下所示。

 

二进制数组合里,每个数位被称为bit(位),能表达值01。二进制数的base值是2,那么在n个二进制数字的序列中,其值为

值=(Dn-1×2n-1)+(Dn-2×2n-2)+…+(D1×21)+(D0×20)

这是一个数学上的算式。这个值是我们很容易辨识的十进制值。

二进制数的排列

在日常的书写或表达上,最左边的位是最高位。数的位排列从左到右,对应的值从高到低。可是在机器的数字电路上,数的高低位可以从左到右进行排列,也可以从右到左进行排列。这样就产生了MSBLSB的概念。

什么是MSB?什么是LSB?

以一个自然的二进制表达序列上32位的二进制数为例,最右边是bit 0,最左边是bit 31。那么bit 0就用LSBLeast Significant Bit,最低有效位)来表示,bit 31就用MSBMost Significant Bit,最高有效位)来表示。

 

MSB也用做符号位(1为负,0为正),但若在无符号数上,则MSB就是数的最高位,LSB是数的最低位。无论一个数在机器上是从左到右排列,还是从右到左排列,使用MSBLSB的概念都很容易对其二进制形式进行描述说明。

小端序与大端序

二进制数在计算机的组织存放中,地址由低位到高位对应着两种排列。

①由LSBMSB,这就是小端序(little-endian)排法。

②由MSBLSB,这就是大端序(big-endian)排法。

x86/x64体系中使用的是小端序存储格式,也就是:MSB对应着存储器地址的高位,LSB对应着存储器地址的低位。

在有些RISC(精简指令集计算机)体系里,典型的如Power/PowerPC系列,使用大端序排法。即在由低到高的地址位里,依次存放MSBLSB。亦即:MSB存放在存储器地址的低位,LSB存放在高位。

代码清单1-1:

        mov dword [Foo], 1

        test byte [Foo], 1                                ; 测试 LSB 是否存放在低端上

        jnz IS_little_endian                              ; 是小端序

上面的代码将1存放在32位的内存里,通过读取内存的低字节来判断1到底存放在低字节还是高字节,从而区分是小端序还是大端序。

某些RISC机器上是可以在大端序与小端序存储序列之间做选择的。大端序格式看上去更符合人类表达习惯,而小端序看上去不那么直观,不过这对于计算机的处理逻辑并无影响。

实验1-1:测试字节内的位排列

字节内的位是否有大端序和小端序之分?这似乎没有定论,我们不是硬件设计人员,很难做出判断。笔者倾向于认为位的排列是区分的。

从代码清单1-1我们可以测试机器是属于小端序还是大端序,原理是根据字节在内存中的存储序列进行判断。对代码稍做修改,即可用来测试位的排列,如代码清单1-2所示。

代码清单1-2topic01\ex1-1\boot.asm):

        mov dword [Foo], 2                                       ;

00000000000000000000000000000010B

        bt dword [Foo], 1                                        ; bit 1

        setc bl                                                     ; bit 1 是否等于 1

        movzx ebx, bl

        mov si, [message_table + ebx * 2]

        call print_message

               

next:       

        jmp $

       

Foo                     dd 0

LSB_to_MSB            db 'byte order: LSB to MSB', 13, 10, 0

MSB_to_LSB            db 'byte order: MSB to LSB', 13, 10, 0

message_table        dw MSB_to_LSB, LSB_to_MSB, 0

代码清单1-2中测试内存中的bit 1是否为存进去的值1,然后输出一条信息。下面是这个实验在真实计算机上的测试结果。

 

实际上这个方法未必能测出什么(如果CPU一次访问字节,这个测试结果并不能说明什么)。按这个方法测出字节内也是小端序排列的。

数据类型

x86/x64体系中,指令处理的数据分为fundamental(基础)和numeric(数值)两大类。基础类型包括:byte8位),word16位),doubleword32位),以及quadword64位),它们代表指令能一次性处理的数据宽度。

numeric数据类型使用在运算类指令上,总结来说x86/x64体系的运算类指令能处理下面四大类数据。

integer(整型数):包括unsigned类型和singed类型。

floating-point(浮点数):包括single-precision floating-point(单精度浮点数),double-precision floating-point(双精度浮点数),以及double extended-precision floating-point(扩展双精度浮点数)。

BCDbinary-code decmial integer):包括non-packed BCD码和packed-BCD码。

SIMDsingle instruction, multiple data):这是属于packed类型的数据。

SIMD数据是在一个operand(操作数)里集成了多个integerfloating-point或者BCD数据。SIMD指令可以一性次同时处理这些数据。

 

 

本文节选自《x86x64体系探索及编程》

 

电子工业出版社出版

邓志著

分享到:
评论

相关推荐

    x86 x64体系探索及编程part1

    目录 第一篇 x86 基础 第1 章数与数据类型2 1.1 数 2 1.1.1 数字 2 1.1.2 二进制数 3 1.1.3 二进制数的排列 3 1.1.4 十六进制数 5 1.1.5 八进制数与十进制数 5 1.2 数据类型 6 1.2.1 integer 数 6 1.2.2 floating-...

    x86 x64体系探索及编程part4

    目录 第一篇 x86 基础 第1 章数与数据类型2 1.1 数 2 1.1.1 数字 2 1.1.2 二进制数 3 1.1.3 二进制数的排列 3 1.1.4 十六进制数 5 1.1.5 八进制数与十进制数 5 1.2 数据类型 6 1.2.1 integer 数 6 1.2.2 floating-...

    x86 x64体系探索及编程 part2

    目录 第一篇 x86 基础 第1 章数与数据类型2 1.1 数 2 1.1.1 数字 2 1.1.2 二进制数 3 1.1.3 二进制数的排列 3 1.1.4 十六进制数 5 1.1.5 八进制数与十进制数 5 1.2 数据类型 6 1.2.1 integer 数 6 1.2.2 floating-...

    x86 x64体系探索及编程part3

    目录 第一篇 x86 基础 第1 章数与数据类型2 1.1 数 2 1.1.1 数字 2 1.1.2 二进制数 3 1.1.3 二进制数的排列 3 1.1.4 十六进制数 5 1.1.5 八进制数与十进制数 5 1.2 数据类型 6 1.2.1 integer 数 6 1.2.2 floating-...

    RamDisk Plus (内存虚拟硬盘)v10.0.1 x86 x64 含注册机

    与RamDisk的不同之处在于,RamDisk Plus加入了当服务器关机时能够自动保存RAM 磁盘中内容的能力以及当服务器启动时将数据加载到RAM磁盘的能力。支持Windows 2000/XP/2003的版本。对一些数据存取速度要求很高的程序...

    数据基础设施:超融合与大数据.doc

    数据基础设施:超融合与大数据 作者:明晨 来源:《软件和集成电路》2016年第08期 领航盛辉于2014年11月成立,核心技术团队均来自于硅谷,研发团队有40~50 人左右,占整个公司规模的70%以上。目前,我们在全国拥有6...

    汇编语言编程艺术

    本书以X86系列微机为背景,从简单的Hello程序开始,系统而详细地阐述了X86微机汇编语言编程的行种基础知识和编程技巧,内容涉及到数据表示、存储器管理、各种数据类型、过程、与汇编语言相关的体系结构、控制结构、...

    The Art of Assembly Language

    本书以X86系列微机为背景,从简单的Hello程序开始,系统而详细地阐述了X86微机汇编语言编程的行种基础知识和编程技巧,内容涉及到数据表示、存储器管理、各种数据类型、过程、与汇编语言相关的体系结构、控制结构、...

    elasticsearch-7.6.0-x86_64.part1.rar

    Elasticsearch 是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。Elasticsearch 在 Apache Lucene 的基础上开发而成

    elasticsearch-7.6.0-x86_64.part2.rar

    Elasticsearch 是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。Elasticsearch 在 Apache Lucene 的基础上开发而成

    汇编语言编程艺术_Randall Hyde

    本书以X86系列微机为背景,从简单的Hello程序开始,系统而详细地阐述了X86微机汇编语言编程的各种基础知识和编程技巧,内容涉及到数据表示、存储器管理、各种数据类型、过程、与汇编语言相关的体系结构、控制结构、...

    The.Art.Of.Assembly.Language

    本书以X86系列微机为背景,从简单的Hello程序开始,系统而详细地阐述了X86微机汇编语言编程的各种基础知识和编程技巧,内容涉及到数据表示,存储器管理,各种数据类型,过程,与汇编语言相关的体系结构,控制结构,文件,宏...

    服务器基础知识介绍(服务器全部组件).pdf

    中档服务器,为100个左右的客户端提供服务 高档服务器,用于数百台以上的客户端访问 服务器的分类——按处理器类型 处理器类型 CISC(复杂指令集) X86, IA-32, EM64T, AMD 64 EPIC(显式并行指令集) IA-64安腾...

    服务器基础知识培训教程.docx

    【效劳器的分类及比照】 具体效劳器如何分类,其从不同方面又有多种分类方法: 按cpu类型分:a、risc架构效劳器,使用risc芯片并且主要采用unix操作系统的效劳器,如sun公司的sparc、hp公司的pa-risc、dec的alpha...

    宋劲彬的嵌入式C语言一站式编程

    6. 字符类型与字符编码 3. 简单函数 1. 数学函数 2. 自定义函数 3. 形参和实参 4. 全局变量、局部变量和作用域 4. 分支语句 1. if语句 2. if/else语句 3. 布尔代数 4. switch语句 5. 深入理解函数 1. return语句 2. ...

    决战JAVA大后端-解决JavaWeb后端疑难杂症 JAVA后端高级开发技术专题课程 大牛亲授

    ├─数据类型和运算符.ppt ├─笔记.docx (2)\10.实用类 ├─class_temp.rar ├─实用类介绍.ppt ├─笔记.docx (3)\10.排序算法-2 ├─class010.rar ├─笔记.doc ├─算法基础.ppt (4)\11.异常 ├─class012.rar ...

    Linux服务器配置与管理项目8--FTP服务器配置与管理.pptx

    Linux服务器配置与管理项目8 FTP服务器配置与管理 Linux服务器配置与管理项目8--FTP服务器配置与管理全文共50页,当前为第1页。 【项目描述】 公司为方便内部信息的交流,需要一台FTP服务器实现公司内部文件的上传...

    C语言讲义.doc

    9.3 函数的返回类型与返回值 46 9.4 MAIN函数与EXIT函数与函数的RETURN语句 46 9.5 多个源代码文件程序的编译 47 9.5.1 头文件的使用 47 9.5.2 #include与#define的意义 47 9.5.3 #ifndef与#endif 47 9.6 函数的递归...

    Windows内核安全与驱动开发光盘源码

    2.2.1 基本数据类型 19 2.2.2 返回状态 19 2.2.3 字符串 20 2.3 重要的数据结构 21 2.3.1 驱动对象 21 2.3.2 设备对象 22 2.3.3 请求 24 2.4 函数调用 25 2.4.1 查阅帮助 25 2.4.2 帮助中有的几类函数 26 ...

Global site tag (gtag.js) - Google Analytics