zoukankan      html  css  js  c++  java
  • 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体系探索及编程》

    电子工业出版社出版

    邓志著

  • 相关阅读:
    vue1.0
    网络抓包(四)
    物联网框架ServerSuperIO
    Solrcloud(Solr集群)
    机器学习1
    TCP/IP协议族(一)
    ElasticSearch(简称ES)
    工具
    线程本地变量的使用
    Features of Spring Web MVC
  • 原文地址:https://www.cnblogs.com/broadview/p/2769260.html
Copyright © 2011-2022 走看看