`

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基础教程

    《X86基础教程》是一份专为初学者设计的嵌入式系统教育资源,它涵盖了8086微处理器的基础知识,并结合Protues软件,使学习者能够在没有实体硬件的情况下理解8086的工作原理。这份教程通过四个章节,深入浅出地介绍了...

    Compiler Design Associated Supplemental Materials Generating x86

    x86架构支持多种类型的处理器,并被许多其他公司采用。 #### 三、栈帧结构 在x86架构下,栈帧(Stack Frame)的设计与MIPS架构有所不同。栈帧是用于存储函数调用时的数据结构,包括局部变量、参数、返回地址等。...

    x86汇编程序基础(AT&T语法)

    这里的`l`表示`long`,即32位数据类型。 - `movl $4, %ebx`: 类似地,将立即数`4`赋值给`ebx`寄存器。 **2. int $0x80**: 此指令是触发系统调用的关键。具体来说: - **软中断**:`int`指令用于产生软中断,使得...

    X86 Assembly Language and C Fundamentals

    - **变量与数据类型**:C语言支持多种内置数据类型,包括整型(int)、字符型(char)、浮点型(float/double)等。通过使用这些数据类型,开发者可以轻松地在程序中表示和处理各种信息。 - **控制结构**:C语言提供了多种...

    x86指令手册

    #### 二、基础知识:寄存器、数据类型与内存 ##### 2.1 寄存器 现代x86架构(也称为IA-32或Intel Architecture 32)包含八个32位整型寄存器。这些寄存器并不是完全通用的,即某些指令可能限制了操作数寄存器的选择...

    The x86 Instruction Set Architecture1

    #### 二、基础知识:寄存器、数据类型与内存 在深入探讨x86架构之前,我们首先需要了解几个基本概念:寄存器、数据类型和内存。这些是理解任何计算机体系结构的基础。 ##### 2.1 寄存器 x86架构中的寄存器主要...

    简明x86汇编语言教程

    通过本文提供的教程,读者可以掌握x86汇编语言的基础知识,理解计算机如何处理数据和执行指令,从而在面对需要精确控制硬件的场景时,能够得心应手地使用汇编语言解决问题。虽然汇编语言的学习曲线相对陡峭,但随着...

    x86_64 ABI

    这一部分涵盖了x86_64架构的底层细节,是理解和使用x86_64 ABI的基础。 ##### 3.1 机器接口 这部分详细阐述了x86_64架构的关键特性及其数据表示方式。 ###### 3.1.1 处理器架构 x86_64处理器扩展了传统的x86架构,...

    这本书是学习x86汇编语言的经典教材之一

    寄存器是处理器内部快速访问的数据存储单元,x86处理器有多种类型的寄存器,如通用寄存器(EAX、EBX、ECX、EDX等)、段寄存器(CS、DS、ES、FS、GS、SS)和指针寄存器(ESP、EIP)等。掌握这些寄存器的用途和使用...

    x86 cpu模拟程序

    DEMO.ASM:这个文件可能是一个演示性的汇编程序,用于展示x86指令的使用,可能包含了基础的寄存器操作、数据加载和存储等操作。分析这个文件可以帮助我们了解x86指令的基本结构和用法。 SSEG_HW.ASM:"SSEG"通常指...

    维盟x86 U盘启动盘制作 安装.rar

    2. **下载镜像文件**:首先,你需要下载维盟x86的操作系统镜像文件,这是制作启动盘的基础。 3. **格式化U盘**:使用工具将U盘格式化为FAT32或NTFS格式,确保其兼容性。 4. **写入镜像**:运行制作工具,选择你...

    32位x86汇编语言简明教程

    这种灵活性使得程序员能够根据具体需求选择合适的数据类型进行操作,提高了编程效率和代码的紧凑性。 #### 三、32位x86汇编语言编程模型 32位x86编程模型相对于16位模型来说更加简洁高效,它摒弃了复杂的段式内存...

    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架构下虚拟机技术应用 PDF

    x86架构源自早期的Intel 8086处理器,历经数十年的发展,已经发展出多代产品,如 Pentium、Core、Xeon 等系列。这一架构以其兼容性、性能和广泛的软件支持而闻名,使得它成为了虚拟化技术的理想平台。 二、虚拟机...

    x86 指令手册

    《x86指令手册》是一部详尽记录了Intel 64位与IA-32架构下所有指令集的专业指南。该手册不仅对每一项指令进行了深入浅出的解析,还为软件开发者提供了必要的背景知识和技术细节,帮助他们更好地理解和应用这些指令。...

    X86汇编语言X86汇编语言

    2. **指令集**:X86指令集包括许多不同类型的指令,如数据处理指令(ADD、SUB、MUL、DIV等)、控制流指令(JMP、CALL、RET等)、输入输出指令(IN、OUT等)和处理内存的指令(MOV、LEA等)。 3. **寻址模式**:X86...

    X86指令解析-java实现

    X86指令集包括各种类型的操作码(opcode),它们定义了处理器执行的不同操作,如数据移动、算术运算、逻辑操作、控制流等。解析X86指令通常涉及以下几个步骤: 1. **二进制提取**:读取EXE文件,这些文件包含了机器...

    x86编译器的汇编优化指南

    2. **数据存储**:讨论了不同数据类型(如整数、浮点数)的存储格式及布局。 3. **函数调用约定**:详细介绍了栈帧的构建与销毁、参数传递方式等内容,这些都是实现高效函数调用的关键。 4. **名称修饰与解修饰*...

    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-...

Global site tag (gtag.js) - Google Analytics