机器语言与汇编语言
机器语言是机器指令的集合,而机器指令则是由一串二进制数表示。
汇编语言的主体是汇编指令,汇编指令是机器指令的助记符,是一一对应的关系;
汇编语言其他部分由编译器执行的伪指令和编译器识别的其他符号组成。
计算机的组成
我没有系统性的学习过计组的知识,这里是基于视频教程和8086(十六位)给出的一些知识点,若有错误请轻喷。
关于主板
主板由下面四个部分组成:
- CPU
- 总线
- 内存
- 扩展槽
CPU
CPU是计算机的核心组件,控制运作和运算,而提供指令和数据可以让它工作。
各个组成部分
- 运算器:进行信息处理
- 寄存器:进行信息存储
- 控制器:协调组件工作
- 内部总线:实现CPU内各个器件之间的联系
内存
存储单元
存储器中被划为若干个单元,从0开始编号。
地址空间
对应内存单元的个数,一个内存单元是1字节。
所有物理存储器被看作一个由若干单元组成的逻辑存储器,每个物理存储器占其中的一个地址段,也就是一段地址空间。
CPU读写数据就是在对应物理存储器中读写数据。
物理地址
每一个内存单元在所有内存单元构成的一维线性空间中都有唯一的地址,这个地址被称为物理地址。
例如:8086CPU用两个16位地址(段地址、偏移地址)合成一个20位的物理地址。
物理地址=段地址 X 16(左移四位) + 偏移地址
读写
CPU要进行数据读写,必须的交互:
- 存储单元的地址(地址信息)
- 器件的选择,读或写命令(控制信息)
- 读或写的数据(数据信息)
总线
定义
基本认识:连接CPU和芯片的导线。
物理上是一根根导线的集合。
逻辑上分为三种:
- 地址总线
- 数据总线
- 控制总线
地址总线
指定存储单元,宽度决定存储大小。
数据总线
控制CPU与内存和其他组件的数据传输,宽度决定传送速度。
控制总线
CPU通过控制总线对外部器件进行控制,宽度决定控制能力。
扩展槽
主板上用于插入各种扩展卡的物理插槽,主要作用是为计算机增加或升级功能,弥补主板自带功能的不足,如下图:

关于指令和数据
存储在内存或磁盘上,都是二进制信息。
由CPU决定二进制信息是指令还是数据。
数据用二进制B,十六进制H,八进制O,十进制D表示。
数据量:B KB MB GB TB
寄存器
什么不加是16位,加E是32位,加R是64位。
例如:AX EAX RAX
通用寄存器
- AX:Accumlator 累加器
- BX:Base 基地址寄存器
- CX:Count 计数器
- DX:Data 数据寄存器
以AX为例
十六位寄存器可以存储一个十六位数据。
最大值是二进制1111 1111 1111 1111,即十进制2^16 - 1(65535),十六进制的FFFF。
在8088中AX可以分为AH和AL(其他寄存器也一样)。
8086的字长为16bit,一个字可以存在一个十六位寄存器上,高位字节存在这个寄存器的高8位寄存器,低位字节存在低8位寄存器。
指针寄存器
- SP:Stack Pointer堆栈指针
- BP:Base Pointer基址指针
变址寄存器
- SI:Source Index源变址
- DI:Destination Index目的变址
指令指针寄存器
IP:Instruction Pointer存放下一条将要执行指令的偏移地址
段寄存器
- CS:Code Segment代码段
- DS:Data Segment数据段
- SS:Stack Segment堆栈段
- ES:Extra Segment附加段
标志寄存器
PSW:Program Status Word程序状态字
PSW 在 8086 中常称为FLAGS。
常用x86/x64汇编指令集
下面是一些常用的x86/x64汇编指令。
一、数据传送指令
| 指令 | 操作 | 示例 | 说明 |
|---|---|---|---|
| MOV | 目的 ← 源 | mov eax, 123 | 最基础的数据传送 |
| MOVZX | 零扩展传送 | movzx eax, bl | 8→32位,高位补0 |
| MOVSX | 符号扩展传送 | movsx rax, al | 8→64位,保留符号 |
| LEA | 取有效地址 | lea rbx, [rax+rcx*4] | 计算地址,不访问内存 |
| XCHG | 交换 | xchg eax, ebx | 交换两个寄存器/内存的值 |
| PUSH | 压栈 | push rax | RSP -= 8, [RSP] = RAX |
| POP | 弹栈 | pop rcx | RCX = [RSP], RSP += 8 |
二、算术运算指令
| 指令 | 操作 | 示例 | 说明 |
|---|---|---|---|
| ADD | 加法 | add rax, rbx | RAX += RBX |
| SUB | 减法 | sub rsp, 32 | RSP -= 32 |
| INC | 加1 | inc rcx | RCX++ |
| DEC | 减1 | dec rdx | RDX— |
| NEG | 取负 | neg rax | RAX = -RAX |
| MUL | 无符号乘 | mul rbx | RDX:RAX = RAX * RBX |
| IMUL | 有符号乘 | imul rax, 5 | RAX *= 5 |
| DIV | 无符号除 | div rbx | RAX = RDX:RAX / RBX, RDX = 余数 |
| IDIV | 有符号除 | idiv rbx | 同上,有符号版本 |
三、逻辑与移位指令
| 指令 | 操作 | 示例 | 说明 |
|---|---|---|---|
| AND | 按位与 | and rax, 0xFF | 保留低8位 |
| OR | 按位或 | or rcx, rdx | 合并位 |
| XOR | 按位异或 | xor rax, rax | 常用清零(等价 RAX=0) |
| NOT | 按位非 | not rbx | 逐位取反 |
| SHL | 左移 | shl rax, 2 | RAX <<= 2(乘以4) |
| SHR | 逻辑右移 | shr rax, 1 | RAX >>= 1(除以2) |
| SAR | 算术右移 | sar rbx, 3 | 保留符号右移 |
| ROL/ROR | 循环左/右移 | rol al, 1 | 循环移位 |
四、控制转移指令
无条件跳转
| 指令 | 说明 | 示例 |
|---|---|---|
| JMP | 无条件跳转 | jmp label |
| CALL | 调用子程序 | call func |
| RET | 返回 | ret / ret 16 |
条件跳转(基于标志位)
| 指令 | 条件 | 说明 |
|---|---|---|
| JE / JZ | ZF=1 | 相等/为零 |
| JNE / JNZ | ZF=0 | 不等/非零 |
| JG / JNLE | ZF=0且SF=OF | 有符号大于 |
| JGE / JNL | SF=OF | 有符号大于等于 |
| JL / JNGE | SF≠OF | 有符号小于 |
| JLE / JNG | ZF=1或SF≠OF | 有符号小于等于 |
| JA / JNBE | CF=0且ZF=0 | 无符号大于 |
| JAE / JNB | CF=0 | 无符号大于等于 |
| JB / JNAE | CF=1 | 无符号小于 |
| JBE / JNA | CF=1或ZF=1 | 无符号小于等于 |
五、比较与测试指令
| 指令 | 操作 | 示例 | 说明 |
|---|---|---|---|
| CMP | 比较 | cmp rax, rbx | 执行减法,设置标志位 |
| TEST | 测试 | test rax, rax | 按位与,设置标志位 |
六、字符串操作指令
| 指令 | 说明 | 常用前缀 |
|---|---|---|
| MOVS | 复制字符串 | rep movsb |
| STOS | 存储字符串 | rep stosb |
| LODS | 加载字符串 | lodsb |
| CMPS | 比较字符串 | repe cmpsb |
| SCAS | 扫描字符串 | repne scasb |
七、标志位操作指令
| 指令 | 说明 |
|---|---|
| CLC | 清除进位标志 |
| STC | 设置进位标志 |
| CMC | 取反进位标志 |
| CLD | 清除方向标志(递增) |
| STD | 设置方向标志(递减) |
八、常用伪指令(汇编器指令)
| 伪指令 | 说明 | 示例 |
|---|---|---|
| DB / BYTE | 定义字节 | db 0x55 |
| DW / WORD | 定义字(2字节) | dw 1234 |
| DD / DWORD | 定义双字(4字节) | dd 0x12345678 |
| DQ / QWORD | 定义四字(8字节) | dq buffer |
| EQU | 定义常量 | SIZE equ 100 |
| ALIGN | 地址对齐 | align 16 |