CSAPP-程序的机器级表示

138 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

这篇文章的主题是各类寄存器的作用, 寄存器在计算机体系中占据着十分重要的作用,了解他们有利于我们计算机知识体系的完善。

寄存器

寄存器存储的数据的大小,决定了具体使用哪个寄存器

不同寄存器的作用

前六个寄存器(%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. 生成1字节和2字节数字的指令会保持剩下的字节不变;
  2. 生成4字节数字的指令会把高位4个字节置为0。

当汇编指令以立即数作为源操作数时,该立即数只能是32位的补码表示(然后对该数值进行符号位扩展),且目的操作数只能是寄存器

  • 当立即数本来就是64位时,会使用movsbsq指令