关于CPU寄存器的那些事儿(3)——通用寄存器

通用寄存器:是程序执行代码最最常用,也是最最基础的寄存器,程序在执行过程中,绝大部分时间都是在操作这些寄存器来实现指令的功能。

既然是通用的,那么这些寄存器就没有特殊的用途,应用程序爱怎么使用怎么使用,只要遵循一个既定的潜规则即可。

eax: 通常用来执行加法,函数调用的返回值一般也放在这里面

ebx: 数据存取

ecx: 通常用来作为计数器,比如for循环 .//C++中this指针也是通过ecx来传递的,可以通过反汇编来验证。

edx: 读写I/O端口时,edx用来存放端口号

esp: 栈顶指针,指向栈的顶部

ebp: 栈底指针,指向栈的底部,通常用ebp+偏移量的形式来定位函数存放在栈中的局部变量

esi: 字符串操作时,用于存放数据源的地址

edi: 字符串操作时,用于存放目的地址的,和esi两个经常搭配一起使用,执行字符串的复制等操作

在x64架构中,上面的通用寄存器都扩展成为64位版本,名字也进行了升级。上面的名字仍然是可以使用的,相当于访问64位寄存器的低32位。

rax rbx rcx rdx rsp rbp rsi rdi

x64架构还增加了8个新的通用寄存器:

r8,r9,r10,r11,r12,r13,r14,r15

与32位cpu比起来,x64的寄存器资源非常丰富了,所以参数传递绝大多数都是用寄存器来传了。寄存器传参的好处是速度快,减少了对内存的读写次数。

当然,具体使用栈还是用寄存器传参数,这个不是编程语言决定的,而是编译器在编译生成CPU指令时决定的,如果编译器非要在x64架构CPU上使用线程栈来传参那也不是不行,这个对高级语言是无感知的。

猜你喜欢

转载自blog.csdn.net/lianshaohua/article/details/109241071
今日推荐