更多文章关注公众好【白羊哈哈】
1 通用寄存器
Intel64
下有16
个64bit
的通用寄存器:rax
rbx
rcx
rdx
rdi
rsi
rbp
rsp
r8
~r15
。
在上面这些通用寄存器当中,rsp
是栈顶指针,rbp
是栈帧基址指针。
从上图可以看到,栈区由一个个栈帧组成。rsp
指向最上层栈帧的顶部,rbp
指向这个栈帧的最底部。
这16
个寄存器不仅可以按照64bit
访问,还可以按照8bit
、16bit
、32bit
访问。
从上图可以看到,对于寄存器rax
rbx
rcx
rdx
除了可以访问最低的8bit
之外,还可以访问8bit
~15bit
。
2 段寄存器
Intel64
下有6
个16bit
段寄存器:cs
ds
ss
es
fs
gs
。
在32
位系统下,这些段寄存器里面存储着段描述符。
在64
位系统下使用线性地址,已经不需要分段寻址了,除了fs
与gs
寄存器,无论给剩下的段寄存器设置什么值,最终CPU
都把它们的值当成0
来使用。而寄存器fs
和gs
的值,可能在计算线性地址中使用到。
3 状态寄存器
状态寄存器记录系统和程序执行过程中的各种状态,比如进行加法操作时是否发生了进位等等。
在32
位系统下,状态寄存器记为eflags
。在64
位系统下,状态寄存器被扩充到了64bit
,记为rflags
。
rflags
虽然有64bit
,但是其高32bit
被保留未使用,低32bit
和eflags
寄存器的一样:
4 指令指针寄存器
Intel64
下指令指针寄存器记为rip
。
rip
寄存器存储着下一条要执行的指令地址:
从上图可以看到,使用lldb
打印rip
的值和断点处的汇编代码地址是一样的。因为断点处的汇编代码,就是要执行的下条指令。
5 xmm 寄存器
Intel64
下有16
个128bit
的xmm
寄存器,记为xmm0
~xmm15
。
在Intel
CPU
规范中,1
个字(word
)等于16bit
。
因此,每一个xmm
寄存器可以一次存储4
个单精度浮点数,2
个双精度浮点数,16
个1
字节整数,8
个1
字整数,4
个2
字整数,2
个4
字整数。
由于xmm
寄存器可以处理浮点数,因此现代应用处理浮点数都使用xmm
寄存器,用来取代x87 FPU
寄存器。
上图中可以看到,汇编代码里面使用xmm
来操作的浮点数计算,对应的OC
代码如下:
ObjectiveC
+ (void)testDouble {
double d1 = 2.0;
double d2 = 3.0f;
double d3 = d1 + d2;
NSLog(@"%f", d3);
}
本文由mdnice多平台发布