赞
踩
对于
寄存器
的学习,不要死记硬背,这些东西绝大部分情况下
你是用不到的,但是这个知识关系到最底层的一些东西的实现,比如我们如何
去访问内存,一定是段寄存器+通用寄存器
的方式;所以我们学习寄存器一定是去理解这个机制,帮助我们在代码阶段
少一些迷惑,少踩一些坑,以及去理解分页机制
等机制
0x0 这是一张8086CPU的解剖图,比较复杂
0x1 这是一张嵌入式CPU的电路图
0x2 下面是一张CPU内部的结构图。那些是重要部分呢?
PSW:程序状态字;
PC: 程序计数器;
寄存器
0x3 利用抽象思维再次简化,理解了寄存器,你就理解了CPU
CPU和内存一起工作的时候,可以简单表示为下图
由于CPU硬件的这种情况,所以一般CPU的指令都是这样的格式。
这也是为什么寻址这个概念在汇编中那么重要?
因为运算所需要的数据都是从不同地址的内存或者存储单元里面来的,没有寻址,就无法找到这些数据,也就无从谈计算了
操作码 操作数(或者操作数地址)
0x0 这个是16位CPU的寄存器
0x1 这个是32位CPU的寄存器
0x2 这个是64位CPU的寄存器
0x3 这是一个arm的寄存器示例图
0x4 指令流水线:由于CPU的计算速度非常快,用高速内存和高速缓存都无法解决计算速度和存取速度的差距,所以指令流水线诞生了
0x0
标志
寄存器:
1.不能直接写入
值,需要通过特殊的指令
去写入
2.随着指令的执行,瞬间发生变化的
0x1 通用寄存器:可以直接写/读值
32位 | 16位 | 8位 |
---|---|---|
EAX | AX | AH, AL |
EBX | BX | BH, BL |
ECX | CX | CH, CL |
EDX | DX | DH, DL |
ESI | SI | |
EDI | DI | |
ESP | SP | |
EBP | BP |
EAX(累加器,Accumulator):加减运算的结果会存储在这个寄存器里面;函数的返回值也会存储在这个寄存器
EBX(基地址寄存器,Base Register):主要用于在内存寻址时存放基地址
ECX(计数寄存器,Count Register):
- 在循环和字符串操作时,要用它来控制循环次数;
- 在位操作 中,当移多位时,要用CL来指明移位的位数
- 重复(REP)前缀指令和LOOP指令的内定计数器
EDX(数据寄存器,Data Register)
- 在进行乘、除运算时,它可作为默认的操作数参与运算
- 存放I/O的端口地址
- 被用来放整数除法产生的余数
ESI/EDI(源/目标索引寄存器,Source/Destination Index Register)
- 主要用于存放存储单元在段内的偏移量
- 作为通用寄存器可以进行任意的常规的操作,如加减移位或普通的内存间接寻址。
EBP/ESP:函数调用的时候会使用到
0x2
段
寄存器:CS,DS,ES,SS,FS,GS
1.能够直接修改
和访问
其值
0x3
控制
寄存器:内核态才可以访问
和修改
0x4
调试
寄存器:内核态才可以访问
和修改
。可以用于无痕注入
系统
地址寄存器:跟进程
和线程切换
有关,面试加分项
总结:
通过系统地址寄存器,它会描述我们当前
正在执行任务
的一些状态;通过调试寄存器,我们可以去
控制
它去设置一些硬件的中断,或者一些断点;通过控制寄存器,可以知道
当前这个任务
它的一些模式,还可以配合其他的比如调试寄存器来打开一些新的功能或者关闭一些功能;通过段寄存器对整个
内存段
的一个补充描述;有了段寄存器,就可以通过通用寄存器的一些SDI这些东西配合起来,可以访问一些大的内存地址;通过标志寄存器可以知道CPU给的一个
反馈结果
,计算结果
是放在通用寄存器里的;
EIP:可以
间接的手段
去影响它(写
),函数调用机制这个寄存器就发挥了很大作用
TSC::
时间戳
寄存器
浮点寄存器:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。