深入C语言与程序原理
第一篇 基础知识回顾
数据量单位
- 位(bit)
- 计算机中最小的存储单位,每一个位可以存储一个二进制码值的 0 或 1
- 字节(byte)
- 通常是由八个位组成的一个存储单元。
- 在计算机中,字节是最小的可寻址单位,这意味着 CPU 在使用数据时,可以以字节为单位,为每一字节内存分配一个相应的独立地址。
- 字(word)
- 字的大小并不固定,一个字的大小可能是 2 的幂次个位,比如 16 位、32 位,也有可能是 12 位、27 位等一些并不常见的大小
- 字的概念与具体的处理器或硬件体系架构直接相关
- 字是处理器设计时使用的自然数据单位
- x86-64 平台的字长为 64 位
汇编语言(Assembly Language)
- 特性
- 汇编代码可以经由汇编程序(如 as)进行转换,从而得到二进制的可执行代码
- 汇编语言在机器指令之上基本不具有任何抽象
- 汇编语言使用助记符(Mnemonic)来表示每个低级的机器指令
- 助记符是一类带有自然语义的符号,比如 mov 指令,它是英文单词 “move” 的简写
- 这个指令用来将一个操作数从计算机中的某个位置移动到另一个位置
- 举例来说
- MOV r/m
- rMOV r
- r/mMOV r/m, imm
- r 表示 register,即寄存器;m 表示 memory,即内存中的某个具体位置;imm 表示 immediate,即直接书写在指令中的立即数
- 指令 mov ebx, 1 表示将立即数 1 存放到寄存器 ebx 中(右侧参数为数据来源 src,左侧参数为移动的目的地 dest)
- 指令 mov ebx, 1 对应的机器指令代码为二进制值 bb 01 00 00 00
- 指令 mov ebx, 1 表示将立即数 1 存放到寄存器 ebx 中(右侧参数为数据来源 src,左侧参数为移动的目的地 dest)
- 举例来说
- 机器指令包含信息
- OpCode
- Immediate Data
- MOdR/M
- SIB
- Displacement
- REX
指令集中的寄存器
概念
- 由 CPU 提供的一组位于芯片上的高速存储器硬件,可用于存储数据
- 寄存器拥有最快的数据访问速度和最低的延迟
物理寄存器的分类
- 通用目的寄存器
- 一般用于存放程序运行过程中产生的临时数据,这些寄存器在大多数情况下都可以被当作普通寄存器使用。
- 而在某些特殊情况下,它们可能会被用于存放指令计算结果、系统调用号,以及与栈帧相关的内存地址等信息
- 状态寄存器
- 一般用于存放与指令执行结果相关的状态信息,比如指令执行是否引起进位、计算结果是否为 0 等
- 系统寄存器
- 一般由操作系统使用,这些寄存器描述了与虚拟内存、中断、CPU 模式等有关的信息
- 用于支持浮点计算和SIMD的寄存器
- AVX,SSE寄存器
- 通用目的寄存器
x86-64架构中的寄存器
- CPU指令集架构定义了16个通用目的寄存器,寄存器最大可以存储4个指令字(此处的字与CPU硬件中的硬件字概念不一样,字长位16位),即64位长的数据
寄存器名称示意图
总结
- 常见数据量单位包括位、字节和字。其中,一个字节等于 8 位,而字的大小则与具体的 CPU 体系结构紧密相关,常见大小可以是 32 位与 64 位
- 汇编语言是一种低级编程语言,它用助记符的形式来描述程序对应机器指令的基本逻辑。由于它直接对应于 CPU 指令集之上,因此不具有可移植性
- 寄存器是位于 CPU 芯片上的高速数据存储单元,根据功能,它可以被分为通用目的寄存器、状态寄存器等多种类型。x86-64 一共提供了 16 个通用目的寄存器,通过在汇编代码中使用不同的寄存器别名,我们可以快速访问这些寄存器中存放的数据
思考题
当所有指令执行完毕时,寄存器 eax 中的值是多少?
mov eax, 0x1
inc eax
sub eax, 10
xor eax, eax
add eax, 1
mul eax