Skip to content

Latest commit

 

History

History
106 lines (97 loc) · 3.64 KB

csapp.md

File metadata and controls

106 lines (97 loc) · 3.64 KB

指令集

CISC (复杂指令集)

X86架构

  • 向下兼容
  • 变长指令
1-15字节,多数为2-3字节长度
  • 多种寻址方式(可访问不对齐内存地址)
  • 指令集的通用寄存器的个数有限
X86-32系统下拥有8个通用寄存器(X86-64扩展到16个)
  • 至多只有一个操作数在内存中,另一个操作数为立即数或者寄存器

RISC (精简指令集)

MIPS

  • 以寄存器为中心(32个),只有Load/Store指令访问内存,所有的计算类型指令均从寄存器堆中读取数据并把结果写入寄存器堆中。MIPS32还定义了32个浮点寄存器
  • MIPS指令集的指令格式非常规整,所有指令长度一定,而且指令操作码在固定的位置上。
  • MIPS指令的寻址方式非常简单,每条指令的操作也较简单
  • MIPS32^TM的指令格式只有三种
R (register)类型的指令从寄存器堆读取两个源操作数将结果写回寄存器堆。
I (immediate)类型的指令使用16位的立即数作为源操作数。
J (jump)类型的指令使用26位立即数作为跳转的目标地址(target address)。

ARM

“有些不同”的RISC指令集

  • ARM指令完成简单的操作。编译器或程序员通过几条简单指令的组合来实现一个复杂的操作
  • ARM指令集大多数采用相同的字节长度,并且在字边界上对齐,字段位置固定,特别是操作码的位置。
  • 使用Load/Store 存储模式,只有Load/Store指令访问内存,所有其他指令都只能对寄存器里的操作数进行操作。
  • 大多指令都具有“条件执行”模式
  • 具有16位压缩指令集(Thumb)

数的机器表示

机器字(Machine Word)长

一般指机器进行一次整数运算所能处理的二进制数据的位数
通常也包括数据地址长度。

计算机中整数二进制的编码方式

  • 无符号数--->原码表示
  • 带符号数--->补码表示(它的负数=原码数按位取反加一)

$$B2U(X) = \sum_{i=0}^{w-1}x_i*2^i$$ $$B2T(X) = -x_{w-1}2^{w-1} + \sum_{i=0}^{w-2}x_i2^i$$ $w:机器字长$
$-x_{w-1}*2^{w-1}:符号位$
$带符号数最高位为0时为0或正数;最高位为1表示为负数。$

插入公式详解

无符号整数与带符号整数

取值范围

  • 无符号数

$$UMin = 0$$ $$000...0$$ $$UMax = 2^w-1$$ $$111...1$$

  • 带符号数(补码)

$$TMin = -2^{w-1}$$ $$100...0$$ $$TMax = 2^{w-1}-1$$ $$011...1$$ $$-1=111...1$$

X B2U(X) B2T(X)
0000 0 0
0001 1 1
0010 2 2
0011 3 3
0100 4 4
0101 5 5
0110 6 6
0111 7 7
1000 8 -8
1001 9 -7
1010 10 -6
1011 11 -5
1100 12 -4
1101 13 -3
1110 14 -2
1111 15 -1

无符号数与带符号数之间的转换:二进制串本身是不变化的,只是解释的不一样

C语言中的无符号数语带符号数

常数(Constants)

默认是带符号数

  • 如果有“U”作为后缀则是无符号数,如0U,112312312U

如果无符号数与带符号数混用,则带符号数则默认转换为无符号数

包括比较操作符

实例($w=32$)

$Constant_1$ $Constant_2$ $Relation$ $Evaluation$
0 0U == $unsigned$
-1 0 < $signed$
-1 0U > $unsigned$
2147483647 -2147483647-1 > $signed$
2147483647U -2147483647-1 < $unsigned$
-1 -2 > $signed$
($unsigned$)-1 -2 > $unsigned$
2147483647 2147483648U < $unsigned$
2147483647 ($int$)2147483648U > $signed$