CS

深入理解计算机系统学习笔记 —— 程序的机器级表示 - Ⅰ

Posted by WildCow on April 12, 2018

在那天空的边缘,我们的歌声,您听得见吗?

整数寄存器

0 7 ((b)) 15 ((w)) 31 ((l)) 63 ((q))
返回值 %al %ax %eax %rax
被调用者保存 %bl %bx %ebx %rbx
第 4 个参数 %cl %cx %ecx %rcx
第 3 个参数 %dl %dx %edx %rdx
第 2 个参数 %sil %si %esi %rsi
第 1 个参数 %dil %di %edi %rdi
被调用者保存 %bpl %bp %ebp %rbp
栈指针 %spl %sp %esp %rsp
第 5 个参数 %r8b %r8w %r8d %r8
第 6 个参数 %r9b %r9w %r9d %r9
调用者保存 %r10b %r10w %r10d %r10
调用者保存 %r11b %r11w %r11d %r11
被调用者保存 %r12b %r12w %r12d %r12
被调用者保存 %r13b %r13w %r13d %r13
被调用者保存 %r14b %r14w %14d %r14
被调用者保存 %r15b %r15w %r15d %r15

指示操作符

​ 大多数指令中有一个或多个操作数(operand)指示出执行一个操作中要使用的源数据值,以及放置结果的目的位置。各种不同的操作数的可能新房被分为三种类型。

  • 立即数(immediate),书写方式是$后面跟一个用标准 C 表示方法表示的整数。

  • 寄存器(register),表示某个寄存器的内容,我们用符号 $ r_a$来表示任意寄存器 a,用引用 $R[r_a]$ 来表示,这是将寄存器集合看成一个数组 $R$,用寄存器标识符作为索引。

  • 内存引用,他会根据计算出来的地址(通常称为有效地址)访问某个内存位置。因为将寄存器集合看成一个很大的字节数组,我们用符号 $M_b[Addr]$ 表示对存储在内存中从 $Addr$ 开始的 $b$ 字节值的引用。

    • 有多种不同的寻址模式,允许不同形式的内存引用,$Imm(r_0, r_i, s)$ 表示的是最常用的形式,这样的引用有四个组成部分:一个立即数偏移 $Imm$,一个基址寄存器 $r_0$,一个变址寄存器 $r_i$ 和一个比例因子 $s$,这里 $s$ 必须是 1、2、4 或者 8。基址和变址寄存器都必须是 64 位寄存器,有效地址被计算为

      类型 格式 操作数值 名称
      立即数 $Imm $Imm$ 立即数寻址
      寄存器 $r_a$ $R[r_a]$ 寄存器寻址
      存储器 $Imm$ $M[Imm]$ 绝对寻址
      存储器 $(r_a)$ $M[R[r_a]]$ 间接寻址
      存储器 $Imm(r_b)$ $M[Imm+R[r_b]]$ (基址+偏移量)寻址
      存储器 $(r_b, r_i)$ $M[R[r_b] + R[r_i]]$ 变址寻址
      存储器 $Imm(r_b, r_i)$ $M[Imm+R[r_b] + R[r_i]]$ 变址寻址
      存储器 $(,r_i,s)$ $M[R[r_i]*s]$ 比例变址寻址
      存储器 $Imm(,r_i,s)$ $M[Imm+R[r_i]*s]$ 比例变址寻址
      存储器 $(r_b,r_i,s)$ $M[R[r_b] + R[r_i]*s]$ 比例变址寻址
      存储器 $Imm(r_b,r_i,s)$ $M[Imm+R[r_b] + R[r_i]*s]$ 比例变址寻址
练习题3.1

​ 假设下面的值存放在知名的内存地址和寄存器中:

地址
$0x100$ $0xFF$
$0x104$ $0xAB$
$0x108$ $0x13$
$0x10C$ $0x11
寄存器
%rax $0x100$
%rcx $0xl$
%rdx $0x3$

填写下表,给出所示操作数的值:

操作数
%rax $0x100$
$0x104$ $0xAB$
$0x108 $0x108$
(%rax) $0xFF$
4(%rax) $0xAB$
9(%rax, %rdx) $0x11$
260(%rcx, %rdx) $0x13$
0xFC(, %rcx, 4) $0xFF$
(%rax, %rdx, 4) $0x10C$
  • 寄存器,直接找 $rax$ 寄存器中的值,查表得 $0x100$
  • 绝对地址,地址 $0x104$ 中的值,查表得 $0xAB$
  • 立即数
  • 地址 $0x100$
  • 地址$0x104$,$(100+4)_{16}$
  • 地址$0x10C$,$(100 + 3 + 9)_{16} = 0x10C$
  • 地址$0x108$,$(0x3+0x1){16}+260 = 264{10} = 0x108$
  • 地址$0x100$,$(0x1*4+0xFC){16} = (4 + 252){10} = 256_{10}=0x100$
  • 地址$0x10C$,$0x100+0x3*4=112_{10}=0x10C$
练习题3.2

​ 对于下面汇编代码的每一行,根据操作数,确定适当的指令后缀,将 mov 重写成 movb、

movw、movl、movq

  • movl %eax, ((%rsp)) 根据 %eax
  • movw ((%rax)), %dx 根据 %dx
  • movb $0xFF, %bl 根据 %bl
  • movb ((%rsp, %rdx, 4)), %dl 根据 %dl
  • movq ((%rdx)), %rax 根据 %rax
  • movw %dx, ((%rax)) 根据 %dx

反正不能取括号里的就对了= =!

以上