x86基础之数与数据类型
我们知道在计算机中处理的数是按照一定的规则进行组织和存放的。其中的每个数按特定的编码规则组织。可是光有这些数的组织规则还是不够,计算机每条指令的操作数可能会有不同的数据类型。那么计算机能处理哪些数据类型呢?在这一章里,我们将要了解数与数据类型。
数
计算机能处理各种各样的信息,计算机硬件对数据进行处理后,可呈现出各种各样的信息。
数字
数字是个基本的计数符号。通用的数字有10个:0,1,2,3,4,5,6,7,8,9。以这些数字组合构成的数是十进制数。
思考各个进制数的数字。
1.二进制数字
包括0和1。
2.八进制数字
包括0,1,2,3,4,5,6,7。
3.十进制数字
包括0,1,2,3,4,5,6,7,8,9。
4.十六进制数字
包括0,1,2,3,4,5,6,7,8,9及字母A,B,C,D,E,F。
各个进制以相应的数字表达的计数范围作为base值,如:二进制的base值是2,八进制的base值是8,十进制的base值是10,十六进制的base值是16。
二进制数
二进制数是计算机运算的基础,无论何种制式的数,在计算机中都是以二进制形式存放的。由二进制数字组成的数字序列是二进制数,如下所示。
二进制数组合里,每个数位被称为bit(位),能表达值0和1。二进制数的base值是2,那么在n个二进制数字的序列中,其值为
值=(Dn-1×2n-1)+(Dn-2×2n-2)+…+(D1×21)+(D0×20)
这是一个数学上的算式。这个值是我们很容易辨识的十进制值。
二进制数的排列
在日常的书写或表达上,最左边的位是最高位。数的位排列从左到右,对应的值从高到低。可是在机器的数字电路上,数的高低位可以从左到右进行排列,也可以从右到左进行排列。这样就产生了MSB和LSB的概念。
什么是MSB?什么是LSB?
以一个自然的二进制表达序列上32位的二进制数为例,最右边是bit 0,最左边是bit 31。那么bit 0就用LSB(Least Significant Bit,最低有效位)来表示,bit 31就用MSB(Most Significant Bit,最高有效位)来表示。
MSB也用做符号位(1为负,0为正),但若在无符号数上,则MSB就是数的最高位,LSB是数的最低位。无论一个数在机器上是从左到右排列,还是从右到左排列,使用MSB和LSB的概念都很容易对其二进制形式进行描述说明。
小端序与大端序
二进制数在计算机的组织存放中,地址由低位到高位对应着两种排列。
①由LSB到MSB,这就是小端序(little-endian)排法。
②由MSB到LSB,这就是大端序(big-endian)排法。
在x86/x64体系中使用的是小端序存储格式,也就是:MSB对应着存储器地址的高位,LSB对应着存储器地址的低位。
在有些RISC(精简指令集计算机)体系里,典型的如Power/PowerPC系列,使用大端序排法。即在由低到高的地址位里,依次存放MSB到LSB。亦即: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-2(topic01\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(数值)两大类。基础类型包括:byte(8位),word(16位),doubleword(32位),以及quadword(64位),它们代表指令能一次性处理的数据宽度。
numeric数据类型使用在运算类指令上,总结来说x86/x64体系的运算类指令能处理下面四大类数据。
① integer(整型数):包括unsigned类型和singed类型。
② floating-point(浮点数):包括single-precision floating-point(单精度浮点数),double-precision floating-point(双精度浮点数),以及double extended-precision floating-point(扩展双精度浮点数)。
③ BCD(binary-code decmial integer):包括non-packed BCD码和packed-BCD码。
④ SIMD(single instruction, multiple data):这是属于packed类型的数据。
SIMD数据是在一个operand(操作数)里集成了多个integer、floating-point或者BCD数据。SIMD指令可以一性次同时处理这些数据。
本文节选自《x86x64体系探索及编程》
电子工业出版社出版
邓志著
x86基础之数与数据类型相关推荐
- 20190513——python基础(列表、数据类型:字典、列表和字典的异同)
二.python基础(列表.数据类型:字典.列表和字典的异同) 1.列表 1)什么是列表 2)从列表提取单 ...
- Javase基础(二)——数据类型
Javase基础(二)--数据类型 Javase基础(二)--数据类型和运算 常量 进制概述和二,八,十六进制 进制转换 源码.反码.补码 原码 反码 补码 变量的概述及格式 变量相加和常量相加的区别 ...
- Python基础知识与常用数据类型
Python基础知识与常用数据类型 目录 Python基础知识与常用数据类型 一.Python概述: 二.Python中的基础语法: 三.Python内置数据结构: 4.附录 一.Python概述: ...
- 0编程基础学python之数据类型和数据操作
0基础学习python之数据类型和数据操作 大家都知道,我们python的强大功能之一就是处理数据,所以我们今天就来探讨一下python中的一些数据类型和他们之间的操作吧. 先来回顾学过知识,上图: ...
- openresty开发系列13--lua基础语法2常用数据类型介绍
openresty开发系列13--lua基础语法2常用数据类型介绍 一)boolean(布尔) 布尔类型,可选值 true/false: Lua 中 nil 和 false 为"假" ...
- bool类型头文件_[C++基础入门] 2、数据类型
点击上方 蓝字 关注我呀! [C++基础入门] 2.数据类型 文章目录 2 数据类型 2.1 整型 2.2 sizeof关键字 2.3 实型(浮点型) 2.4 字符型 2.5 转义字符 2.6 字符串 ...
- 深度学习(5)TensorFlow基础操作一: TensorFlow数据类型
深度学习(5)TensorFlow基础操作一: TensorFlow数据类型 Data Container(数据载体) What's Tensor TF is a computing lib(科学计算 ...
- Python基础(二)--数据类型,运算符与流程控制
目录 Python基础(二)--数据类型,运算符与流程控制 1 数据类型 1.1 Python中的数据类型 1.2 整数类型(int) 1.3 布尔类型 1.4 浮点类型 1.5 复数类型 1.6 类 ...
- 试题 基础练习 数的读法
试题 基础练习 数的读法 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 Tom教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体上有成千上万个碱基对,它们从 ...
- 蓝桥杯试题 基础练习 数的读法(c++ Python)
试题 基础练习 数的读法 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 Tom教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体上有成千上万个碱基对,它 ...
最新文章
- 南阳833--取石子(七)
- n!mod p 的求法 数学
- Spring和SpringMVC的总结
- tensorflow 调试_如何开始调试TensorFlow
- Kotlin入门(31)JSON字符串的解析
- 使用hexo搭建github个人博客网站
- [PHP]如何使用Mobile_Detect来判断访问网站的设备:安卓,平板,电脑
- 将java或javaweb项目打包为jar包或war包
- PMP倒计时,整理项目管理中工具和技术
- 微信小程序实时定位的要做的那些事,你学废了吗?(附示例)
- 我的k8s随笔:Kubernetes 1.17.0 部署讲解
- 4G车载信息终端TBOX车联网数据采集智能网联解决方案
- 2019读书计划(3)——《指数基金投资指南》
- JS监听鼠标滑轮事件
- Java数据结构---hashMap
- oracle mysql认证考试流程_报考oraclemysql认证考试的流程是什么
- Serial Port Debug on EBox4300
- 无人驾驶车辆路径跟踪的增量式PID控制
- 人工智能导论学习笔记(教材王万良《人工智能导论》(第四版)高等教育出版社 )
- 关于GTD的网站(更新中...)