字节序
字节序根据存储的方向不同, 分为大端字节序(big-endian) 和 小端字节序(little-endian)
大端字节序(big-endian): 低字节存储在起始地址
小端字节序(little-endian): 高字节存储在起始地址
获得当前主机字节序
#include <iostream>
using namespace std;
int main()
{
union {
short s;
char c[sizeof(short)];
} un;
un.s = 0x0102;
if(sizeof(short) == 2)
{
if(un.c[0] == 1 && un.c[1] == 2)
{
cout << "大端字节序" << endl;
} else if(un.c[0] == 2 && un.c[1] == 1)
{
cout << "小端字节序" << endl;
} else
{
cout << "unknown" << endl;
}
} else
{
cout << "sizeof(short) = " << sizeof(short) << endl;
}
return 0;
}
32位环境中的寄存器
通用寄存器的用途
通用寄存器 | 用途 |
---|---|
EAX | 操作数的运算, 结果 |
EBX | 指向数据段(DS)寄存器中数据的指针 |
ECX | 字符串操作或循环的计数器 |
EDX | 输入输出指针 |
ESI | 指向数据段(DS)寄存器中某个数据的指针, 或者字符串操作中字符串的复制源(source) |
EDI | 指向数据段(ES)寄存器中某个数据的指针, 或者字符串操作中字符串的复制目的地(destination) |
ESP | 栈指针(堆栈段SS) |
EBP | 指向栈上数据的指针(堆栈段) |
通用寄存器的用途不限于上述, 只作为参考
段寄存器的用途
段寄存器 | 用途 |
---|---|
CS | 代码段 |
DS | 数据段 |
堆栈段 | |
ES | 数据段 |
FS | 数据段 |
GS | 数据段 |
程序代码放在代码段, 数据放在数据段, 程序所用的栈放在堆栈段中
EFLAGS寄存器
包含状态标志(status flag), 控制标志(control flag), 系统标志(system flag)
EIP寄存器
用来存储CPU 32位指令指针
CPU每次执行控制器读取完,相应的就再通过EIP寄存器去进行下一次的读取指令工作。每次CPU读取指令到指令缓冲区,相应的EIP寄存器的值增加,增加大小的就是读取指令的字节大小
其他寄存器
控制寄存器(CR0 ~ CR4)
GDRT, IDTR, TR, LDTR
调试寄存器(DR0/DR1/DR2/DR3/DR6/DR7)
内存类型范围寄存器 MTRR, MSR(Model Specific Register) 寄存器
机器检查寄存器(Machine check Register)
性能监控寄存器(Performance Monitoring Counter)
64位环境中的寄存器
对比32位寄存器, 64位支持的地址空间为264位
64位模式下, 通用寄存器在处理32位操作时, 使用EAX/EBX/ECX/EDX/EDI/ESI/EBP/R8D ~ R15D 寄存器
处理64位操作时, 使用RAX/RBX/RCX/RDX/RDI/RSI/RBP/RSP/R8~R15
R8D~R15D / R8 ~ R15 是8个新的通用寄存器
RIP寄存器64位指令寄存器
栈指针和控制寄存器都可以扩展64位,并增加CR8寄存器
调试寄存器可以扩展到64位
GDTR, IDTR可以扩展到10字节
LDTR, TR可以扩展到64位
地址
**物理地址:**CPU通过内存总线访问到的地址
32位模式下最大物理地址64GB(236)
64位模式下最大物理地址: intel(240), AMD(248)
操作系统原理——内存的分段、分页和平坦模型:区别与发展
平坦内存模型
线性地址空间: 单一, 平坦的连续地址空间
linux采用这种内存模型
64位模式采用平坦模式, 不能使用分段式内存模型
分段式内存模型
内存看做段(segment)的独立地址空间集合
通过段选择器和偏移量组成逻辑地址访问段内地址
32位下最多指定16383个段, 各段最大大小为232字节
数据类型
基本数据类型:
字节(8bit), 字(16bit), 双字(32bit), 四字(64bit), 双字(128bit)
整数
整数数据类型:
支持 无符号整数 和 符号整数
无符号整数范围: 0 ~ 最大整数(2n - 1)
符号整数范围: 负数(-2n-1) ~ 正数(2n-1-1)
浮点数据类型:
单精度浮点数(32位) 精度: 24bit
双精度浮点数(64位) 精度: 53bit
扩展精度浮点数(80位) 精度: 64bit