本文已参与「新人创作礼」活动,一起开启掘金创作之路。
这篇文章的主题是各类寄存器的作用, 寄存器在计算机体系中占据着十分重要的作用,了解他们有利于我们计算机知识体系的完善。
寄存器
寄存器存储的数据的大小,决定了具体使用哪个寄存器
不同寄存器的作用
前六个寄存器(%rax, %rbx, %rcx, %rdx, %rsi, %rdi)称为通用寄存器,有其『特定』的用途:
- %rax(%eax) 用于做累加
- %rcx(%ecx) 用于计数
- %rdx(%edx) 用于保存数据
- %rbx(%ebx) 用于做内存查找的基础地址
- %rsi(%esi) 用于保存源索引值
- %rdi(%edi) 用于保存目标索引值
而 %rsp(%esp) 和 %rbp(%ebp) 则是作为栈指针和基指针来使用的。
汇编指令的操作数
操作数有三种基本类型:立即数(Imm)、寄存器值(Reg)和内存值(Mem)。
- 目的操作数不能是一个立即数
寄存器计算
- x86-64 的虚拟地址是由 64 位的字来表示的。在目前的实现中, 这些地址的高 16 位必须设置为 0
当汇编指令以寄存器作为目标时,对于生成小于8字节结果的指令,寄存器中剩下的字节会怎么样,对此有两条规则(记住就行):
- 生成1字节和2字节数字的指令会保持剩下的字节不变;
- 生成4字节数字的指令会把高位4个字节置为0。
当汇编指令以立即数作为源操作数时,该立即数只能是32位的补码表示(然后对该数值进行符号位扩展),且目的操作数只能是寄存器
- 当立即数本来就是64位时,会使用movsbsq指令