描述符
GDT;全局描述符表:主要存放操作系统和个任务公用的描述符
非常重要:在计算机转换成保护模式之后,gdt就用来表示内存中的位置
公用的数据和代码段描述符,各任务的TSS描述符和LDT描述符 tss是任务状态段,存放各个任务私有运行状态信息描述符
GDTR : ,48位
LDT;局部描述符表,主要存放各个任务的私有描述符
段寄存器:高13位表示索引号,低2位表示特权级别
寄存器
32位寄存器
-数据寄存器 用于存储程序运行中间数据,ecx常用于计数
EAX
EBX
ECX
EDX
-变址寄存器 :主要用于存放存储单元段内偏移量;用于寻址
ESI:源地址
EDI:目的地址
- 指针寄存器:用于栈
EBP:栈底
ESP:栈顶
注:在其他地方,变址寄存器和指针寄存器同时也被称为地址寄存器
- 段寄存器:selector 可知系统的段模式是由cpu决定的,段寄存器根据gdt来查找具体位置
CS:代码段寄存器
DS:数据段寄存器
ES:附加数据段寄存器
SS:栈段寄存器
FS:主要用来指向Thread Information Block(TIB) 还可以当作附加段寄存器
GS:全局段寄存器 还可以当作附加段寄存器
段寄存器可以访问这篇bolghttps://blog.csdn.net/pilifeng1/article/details/81842347
- 指令寄存器
EIP:存放下次要执行的指令地址
- 标志寄存器
PSW:程序的运行状态
32位寄存器使用惯例
-
%esp 存储栈顶指针
-
%eax 存储函数返回值
-
%ebx 父过程使用的通用寄存器 所以开始要 pus %ebx
寄存器使用惯例 1. 调用者保存 :父函数保存寄存器数值 1. %eax %edx %ecx 2. 被调用者保存 : 子函数保存寄存器数值 1. %ebx %esi %edi
例如递归调用 %eax直接使用 %ebx使用前保存旧值;退出前恢复
64位寄存器使用惯例
%rsp是专门用于指向栈 %rbp被解放
寄存器使用惯例
1. 调用者保存 :父函数保存寄存器数值
1. %rax %rdx , %rcx, %rsi ,%rdi %r8,%r9,%11
2. 被调用者保存 : 子函数保存寄存器数值
1. %rbx %rbp %r10 %r12,%r13,%r14,%r15
64位下 %rsp往下128字节可以直接使用,不用移动%rsp
Trick
volatile 强制存储在栈空间:记得在c语言编程时有一个声明reg也就是寄存器变量,可以加快对数据的访问,但是当多线程修改同一个变量的时候,就会造成互斥
RISC:MIPS1,mips3
只有load/store指令来访问内存,其他都来操作寄存器为中心32个寄存器
ARM:类似于risc,使用16位操作码,而且具有条件执行
只有load/store指令来访问内存,其他都来操作寄存器为中心32个寄存器
ARM:类似于risc,使用16位操作码,而且具有条件执行