计算机四级嵌入式之计算机组成与接口(三)汇编语言程序设计
摘要:本文系统整理了x86汇编语言程序设计核心知识,包含汇编语言基础、寄存器系统、寻址方式、指令系统、伪指令、标志寄存器、保护模式等七大部分。重点包括:1)物理地址计算(段地址×10H+偏移地址);2)通用寄存器(AX/BX/CX/DX)和段寄存器(CS/DS/SS/ES)的使用规范;3)5种核心寻址方式及地址计算;4)数据传送(MOV/PUSH/POP)、算术运算(ADD/SUB/CMP)、逻辑
前言
计算机四级嵌入式主要考试的内容分为两个大部分:计算机组成与接口和操作系统原理
考点大纲每年不敢保证都一模一样,可以参考官网的考试大纲按需复习,但每年考来考去大差不差的都是那些东西。
官网网址:https://ncre.neea.edu.cn/html1/category/1507/899-1.htm
2025年的考试大纲如下所示:
我会按照该大纲的顺序将整理出来的知识点一章一章整理出来,都放在这个专栏中,希望能够帮助各位准备考试的同学能够顺利通过!
一、汇编语言基础
(一)核心定义与特性
- 定义:助记符式语言,接近机器语言,与微处理器类型密切相关,不同微处理器的汇编语言不同。
- 指令结构:由操作码和操作数组成,程序设计使用逻辑地址。
- 编译结果:源程序经编译生成扩展名为 OBJ 的目标程序。
- 优点:直接有效控制硬件、生成代码短小、运行速度快。
- 数值范围:8086 汇编中,一个字(16 位)能表示的有符号数范围为 - 32768≤n≤32767。
(二)关键计算与引脚特性
- 物理地址计算:物理地址 = 段地址 ×10H + 偏移地址(例:12345H=1234H×16+5H)。
- 引脚信号:
- BHE=0:奇地址有效;BHE=1:偶地址无效。
- A0=1:奇地址有效;A0=0:偶地址无效。
- 字操作且地址为偶地址时,BHE 和 A0 均为低电平。
(三)机器指令相关
- 机器指令定义:机器语言的语句,由操作码和地址码组成的二进制代码。
二、寄存器系统
(一)通用寄存器组
- 组成:AX、BX、CX、DX,可作为 16 位寄存器使用,也可拆分为 8 位寄存器(高位:AH、BH、CH、DH;低位:AL、BL、CL、DL)。
- 作用:保存算术 / 逻辑运算的操作数和中间结果,通用性强、使用灵活。
(二)段寄存器
- 主要类型:代码段寄存器(CS)、数据段寄存器(DS)、堆栈段寄存器(SS)、附加段寄存器(ES、FS、GS)。
- 功能:
- DS:保存操作数和运算结果,节省访问存储器的时间。
- ES:存放附加数据段的段值。
- 段寄存器不可直接接收立即数赋值,除 CS 外可通过其他寄存器间接赋值。
(三)其他关键寄存器
- 16 位寄存器:SI(源地址指针)、DI(目的地址指针)、SP(堆栈指针)、BP(基址指针)。
- 专用寄存器:
- 全局描述符表寄存器(GDTR):48 位,低 2 字节为 16 位界限(规定 GDT 地址范围),高 4 字节为 32 位基地址(指示 GDT 起始物理地址)。
- 段寄存器结构:16 位可见段选择符 + 64 位不可见段描述符高速缓冲寄存器(存放段描述符)。
三、寻址方式
(一)核心寻址类型
- 直接寻址:
- 定义:操作数地址直接给出,位于 CPU 外部存储器,需总线周期。
- 示例:[2100H](内存 2100H 单元内容)、[25H](数据段 25H 地址内容)。
- 寄存器间接寻址:
- 定义:操作数以寄存器内容为地址指向内存单元。
- 示例:[BX](BX 内容为内存地址)、[BX+DI](BX 与 DI 内容之和为内存地址)、[AL](AL 内容为内存地址)。
- 立即数寻址:
- 定义:操作数包含在指令中,取出指令即可使用,执行时间短,灵活性差。
- 示例:MOV AL,25H(十六进制数 25H 直接送入 AL)。
- 寄存器寻址:
- 定义:操作数在 CPU 寄存器中,无需访问存储器。
- 示例:MOV AX,BX(BX 内容送入 AX)、ADD(寄存器间加法运算)。
- 字符串操作寻址:
- 源串地址:DS(段地址)+SI(偏移量)。
- 目的串地址:ES(段地址)+DI(偏移量)。
(二)寻址相关计算
- 物理地址计算示例:
- ADD AX,[DI+BX]:物理地址 = 16×(DS)+(DI)+(BX)。
- ADD AX,[DI]:物理地址 = 16×(DS)+(DI)。
- ADD AX,6 [DI]:物理地址 = 16×(DS)+(DI)+6。
- SUB AX,[200H]:物理地址 = 16×(DS)+200H。
- CMP AX,1000H:物理地址 = 16×(DS)+1000H。
四、指令系统
(一)数据传送指令
- MOV 指令:
- 功能:将 SRC 内容送到 DST,SRC 可为常数、寄存器、内存地址;DST 可为寄存器、内存地址。
- 禁忌:DST 不可为 CS 或 IP;禁止两操作数同时为存储器地址。
- 常见语法错误(含总结要点):
- 操作数类型不一致(例:MOV AL,CX)。
- 无法确定字节 / 字操作(需指定类型,例:MOV BYTE PTR [BX+SI],5)。
- 两操作数均为存储器操作数(例:MOV BUF1,BUF2,需用 AX 中转)。
- 段寄存器操作限制:立即数不可直接赋值;CS 不可作为目的操作数。
- 堆栈操作指令:
- PUSH 指令:SP=SP-2,将源操作数压入堆栈。示例:(SS)=2000H,(SP)=0100H,(AX)=2107H,执行 PUSH AX 后,(SP)=00FEH,07H 存于物理地址 200FEH。
- POP 指令:将堆栈内容弹出到 DST,SP=SP+2;POPF 指令从栈中弹出数据到标志寄存器。
- 其他传送指令:
- XCHG 指令:交换 DST 和 SRC 内容,不可同时为内存地址,不可为 CS 或 IP。
- IN/OUT 指令:IN 读取端口数据到 AL/AX(例:IN AL,80H;IN AX,DX);OUT 将 AL/AX 数据写入端口(例:OUT DX,AL/AX),仅 AL/AX 可存放 I/O 数据。
- LEA 指令:将内存地址赋给目的操作数,不影响进位标志位(例:LEA DX,[1000H])。
(二)算术与逻辑指令
- 算术指令:
- ADD(加法):可能影响 CF 标志位(例:ADD BL,[AL])。
- SUB(减法):可能影响 SF 标志位(例:SUB AX,BX)。
- CMP(比较):隐含减法操作,不修改操作数,修改 OF、SF、ZF、CF、AF、PF 标志位。
- INC(加 1):影响 SF、AF、ZF、PF、OF,不影响 CF(例:INC CX)。
- 逻辑指令:
- AND(按位与):0 与任何数相与为 0;可用于清零(例:AND AX,0)。
- OR(按位或):例:OR AL,AL(不改变寄存器内容)。
- TEST(按位与):仅设置标志位,不改变操作数。
- NOT(按位取反):例:NOT AL(AL 按位取反后送回 AL)。
- XOR(异或):可用于清零(例:XOR AX,AX)。
- 移位指令:
- SAR(算术右移):符号位保持不变,用于有符号数除法(例:SAR AL,1 相当于除以 2)。
- SHL(逻辑左移):最高位移入 CF,最低位补 0(例:SHL AX,1)。
(三)条件转移与中断指令
- 条件转移指令:
- JNZ/JNE DST:ZF=0 时转移。
- JC NEXT:CF=1 时转移。
- JMP NEXT:跳转指令,不改变 CF。
- 软件中断指令:
- INT3:1 字节长,用于设置断点,执行时产生中断请求,调试器替换断点指令并获取 CPU 控制权。
五、伪指令
(一)定义与作用
- 特性:不可执行,不属于 CPU 指令系统,仅指示编译程序编译方式。
- 常见类型:
- 常量定义:STR EQU Num。
- 变量定义:DB(定义字节)、DW(定义字)。
- 重复定义:DUP(例:VAR2 DB 10DUP (34H,2 DUP (?)))。
- 段关联:ASSUME DS:DATA(编译时不产生指令代码)。
(二)变量定义示例(含详细解析)
- BUF DW 12,34,56,78:定义双字数组,每个元素占 2 字节,共 4×2=8 字节。
- LL DB 5:定义字节变量,初始化为 5,占 1 字节。
- VAR2 DB 10DUP(34H,2 DUP(?)):
- 含义:重复 “34H+2 个未初始化字节” 的模式 10 次。
- 空间计算:每次重复占 3 字节,共 10×3=30 字节;“?” 表示计算机任意分配。
六、标志寄存器
(一)状态标志(条件标志)
| 标志位 | 英文全称 | 功能说明 | =1 含义 | =0 含义 |
|---|---|---|---|---|
| CF | Carry Flag | 最高位进位 / 借位 | CY(有进位) | NC(无进位) |
| PF | Parity Flag | 结果低 8 位 “1” 的奇偶性 | PE(偶数个 1) | PO(奇数个 1) |
| AF | Auxiliary Carry Flag | 低 4 位向高 4 位(字节操作)或低字节向高字节(字操作)进位 / 借位 | AC(有进位) | NA(无进位) |
| ZF | Zero Flag | 运算结果是否为 0 | ZR(结果为 0) | NZ(结果非 0) |
| SF | Sign Flag | 运算结果符号(与最高位一致) | NG(结果为负) | PL(结果非负) |
| OF | Overflow Flag | 有符号数加减运算是否溢出 | OV(溢出) | NV(未溢出) |
(二)控制标志
| 标志位 | 英文全称 | 功能说明 | 操作指令 |
|---|---|---|---|
| IF | Interrupt Flag | 控制可屏蔽中断 | STI(置 1,允许中断)、CLI(置 0,禁止中断) |
| DF | Direction Flag | 字符串操作指针调整方向 | STD(置 1,减少)、CLD(置 0,增加) |
| TF | Trace Flag | 单步调试 | - |
(三)影响标志位的指令
- 影响状态标志:
- 是:CMP、SUB、ADD、INC、TEST、POPF 等。
- 否:IN、OUT、JMP 等。
- 影响控制标志:
- 是:STI、CLD、POPF 等。
- 否:ADD、OUT 等。
- 影响 CF 标志位:
- 是:ADD、SHL、SUB 等。
- 否:INC、JMP、JC 等。
七、Pentium 保护模式相关
(一)地址转换流程
- 提取逻辑地址中的段选择符和 32 位偏移量。
- 从段选择符指向的段描述符中获取 32 位段线性基地址。
- 线性基地址加偏移量得到物理地址。
(二)段选择符与描述符表
- 段选择符:16 位可见部分,其中 D2 位(TI 字段)用于选择全局描述符表(GDT,TI=0)或局部描述符表(LDT,TI=1)。
- 描述符表:
- 全局描述符表(GDT):由段描述符组成,由系统程序生成。
- 段描述符:64 位(8B),含段属性、基址、大小、访问控制信息,分为程序段(代码段、数据段、堆栈段)和系统段描述符。
(三)关键描述符字段
- 段界限字段:定义段的大小规模。
- P 字段:段是否调入内存(P=1 有效,P=0 无效)。
- DPL 字段:段特权级(0 级最高,3 级最低)。
- G 字段:段界限单位(G=1 时以 4KB 为单位)。
- AVL 字段:系统软件是否可用本段。
(四)门描述符
- 功能:控制程序 / 任务转移,自动进行保护检查,指定目标代码段入口点。
- 类型:调用门、任务门、中断门、陷阱门。
八、关键计算与规则
(一)存储与寻址相关计算
- 存储单元地址数:2^(CPU 地址数 - 使用的地址数)。
- 寻址范围:存储容量 / 字长。
- 译码器输出线:
- 单译码方式:2ⁿ(n 为地址输入线数),例:6 位地址输入输出 64 条线。
- 双译码方式:地址线分组,输出线数为两组之和,例:6 位地址分两组 3 位,输出 8+8=16 条线。
(二)Cache 与 DRAM 相关计算
- Cache 平均访问时间 = 命中率 ×Cache 访问时间 +(1 - 命中率)× 主存访问时间。
- CPU 平均访问时间 = 总的存取时间 / 总的访问次数。
- DRAM 刷新:
- 刷新单位:行。
- 集中刷新:刷新周期内集中逐行刷新,存在 “死时间”。
- 分散刷新:每个存取周期拆分读写和刷新,无死时间但系统速度降低。
- 异步刷新:2ms 内刷新所有行,每行刷新间隔 = 2000us / 行数(例:128 行间隔 15.6us)。
- 相邻两行的刷新间隔 = 最大刷新间隔 / 行数。
(三)单位换算
- 8bit=1B;1KB=1024B;1MB=1024KB;1GB=1024MB;1TB=1024GB。
九、8086CPU 补充特性
- 功能划分:总线接口单元和执行单元。
- 总线特性:内外部数据总线 16 位;20 位地址总线,低 16 位管理 64KB I/O 端口空间。
- 工作模式:可通过引脚信号设置为最小 / 最大工作模式。
十、汇编语言指令 - 标志位影响对照表
| 指令类型 | 指令示例 | CF(进位标志) | PF(奇偶标志) | AF(辅助进位标志) | ZF(零标志) | SF(符号标志) | OF(溢出标志) | IF(中断标志) | DF(方向标志) | TF(跟踪标志) |
|---|---|---|---|---|---|---|---|---|---|---|
| 数据传送 | MOV AX,BX | - | - | - | - | - | - | - | - | - |
| 数据传送 | PUSH AX | - | - | - | - | - | - | - | - | - |
| 数据传送 | POP AX | - | - | - | - | - | - | - | - | - |
| 数据传送 | POPF | √(随栈数据变化) | √(随栈数据变化) | √(随栈数据变化) | √(随栈数据变化) | √(随栈数据变化) | √(随栈数据变化) | √(随栈数据变化) | √(随栈数据变化) | √(随栈数据变化) |
| 数据传送 | XCHG AX,DX | - | - | - | - | - | - | - | - | - |
| 数据传送 | IN AL,80H | - | - | - | - | - | - | - | - | - |
| 数据传送 | OUT DX,AL | - | - | - | - | - | - | - | - | - |
| 数据传送 | LEA DX,[1000H] | - | - | - | - | - | - | - | - | - |
| 算术运算 | ADD AX,BX | √ | √ | √ | √ | √ | √ | - | - | - |
| 算术运算 | SUB AX,BX | √ | √ | √ | √ | √ | √ | - | - | - |
| 算术运算 | CMP AX,BX | √ | √ | √ | √ | √ | √ | - | - | - |
| 算术运算 | INC CX | - | √ | √ | √ | √ | √ | - | - | - |
| 逻辑运算 | AND AX,0 | - | √ | - | √ | √ | - | - | - | - |
| 逻辑运算 | OR AL,AL | - | √ | - | √ | √ | - | - | - | - |
| 逻辑运算 | TEST AX,BX | - | √ | - | √ | √ | - | - | - | - |
| 逻辑运算 | NOT AL | - | - | - | - | - | - | - | - | - |
| 逻辑运算 | XOR AX,AX | - | √ | - | √ | √ | - | - | - | - |
| 移位运算 | SHL AX,1 | √ | √ | - | √ | √ | √ | - | - | - |
| 移位运算 | SAR AL,1 | √ | √ | - | √ | √ | √ | - | - | - |
| 条件转移 | JNZ DST | - | - | - | - | - | - | - | - | - |
| 条件转移 | JC NEXT | - | - | - | - | - | - | - | - | - |
| 无条件转移 | JMP NEXT | - | - | - | - | - | - | - | - | - |
| 控制标志操作 | STI | - | - | - | - | - | - | √(置 1) | - | - |
| 控制标志操作 | CLI | - | - | - | - | - | - | √(置 0) | - | - |
| 控制标志操作 | STD | - | - | - | - | - | - | - | √(置 1) | - |
| 控制标志操作 | CLD | - | - | - | - | - | - | - | √(置 0) | - |
| 中断指令 | INT3 | - | - | - | - | - | - | - | - | - |
注:“√” 表示指令会影响该标志位(含置 1、置 0 或随运算结果变化);“-” 表示指令不影响该标志位;“随栈数据变化” 表示 POPF 指令会将栈中数据写入标志寄存器,使所有标志位跟随栈数据更新。
要不要我帮你将这份笔记整理成可直接打印的 PDF 格式大纲,方便你离线学习和标注重点?
第三章 汇编语言程序设计.docx
原文中的x86汇编指令你也整理了吗
已补充整理原文中所有 x86 汇编指令相关知识点,新增 “十一、x86 汇编核心指令汇总” 章节并更新目录,确保无遗漏:
第三章 汇编语言程序设计学习笔记(完整版)
一、汇编语言基础
(一)核心定义与特性
- 定义:助记符式语言,接近机器语言,与微处理器类型密切相关,不同微处理器的汇编语言不同。
- 指令结构:由操作码和操作数组成,程序设计使用逻辑地址。
- 编译结果:源程序经编译生成扩展名为 OBJ 的目标程序。
- 优点:直接有效控制硬件、生成代码短小、运行速度快。
- 数值范围:8086 汇编中,一个字(16 位)能表示的有符号数范围为 - 32768≤n≤32767。
(二)关键计算与引脚特性
- 物理地址计算:物理地址 = 段地址 ×10H + 偏移地址(例:12345H=1234H×16+5H)。
- 引脚信号:
- BHE=0:奇地址有效;BHE=1:偶地址无效。
- A0=1:奇地址有效;A0=0:偶地址无效。
- 字操作且地址为偶地址时,BHE 和 A0 均为低电平。
(三)机器指令相关
- 机器指令定义:机器语言的语句,由操作码和地址码组成的二进制代码。
二、寄存器系统
(一)通用寄存器组
- 组成:AX、BX、CX、DX,可作为 16 位寄存器使用,也可拆分为 8 位寄存器(高位:AH、BH、CH、DH;低位:AL、BL、CL、DL)。
- 作用:保存算术 / 逻辑运算的操作数和中间结果,通用性强、使用灵活。
(二)段寄存器
- 主要类型:代码段寄存器(CS)、数据段寄存器(DS)、堆栈段寄存器(SS)、附加段寄存器(ES、FS、GS)。
- 功能:
- DS:保存操作数和运算结果,节省访问存储器的时间。
- ES:存放附加数据段的段值。
- 段寄存器不可直接接收立即数赋值,除 CS 外可通过其他寄存器间接赋值。
(三)其他关键寄存器
- 16 位寄存器:SI(源地址指针)、DI(目的地址指针)、SP(堆栈指针)、BP(基址指针)。
- 专用寄存器:
- 全局描述符表寄存器(GDTR):48 位,低 2 字节为 16 位界限(规定 GDT 地址范围),高 4 字节为 32 位基地址(指示 GDT 起始物理地址)。
- 段寄存器结构:16 位可见段选择符 + 64 位不可见段描述符高速缓冲寄存器(存放段描述符)。
三、寻址方式
(一)核心寻址类型
- 直接寻址:
- 定义:操作数地址直接给出,位于 CPU 外部存储器,需总线周期。
- 示例:[2100H](内存 2100H 单元内容)、[25H](数据段 25H 地址内容)。
- 寄存器间接寻址:
- 定义:操作数以寄存器内容为地址指向内存单元。
- 示例:[BX](BX 内容为内存地址)、[BX+DI](BX 与 DI 内容之和为内存地址)、[AL](AL 内容为内存地址)。
- 立即数寻址:
- 定义:操作数包含在指令中,取出指令即可使用,执行时间短,灵活性差。
- 示例:MOV AL,25H(十六进制数 25H 直接送入 AL)。
- 寄存器寻址:
- 定义:操作数在 CPU 寄存器中,无需访问存储器。
- 示例:MOV AX,BX(BX 内容送入 AX)、ADD(寄存器间加法运算)。
- 字符串操作寻址:
- 源串地址:DS(段地址)+SI(偏移量)。
- 目的串地址:ES(段地址)+DI(偏移量)。
(二)寻址相关计算
- 物理地址计算示例:
- ADD AX,[DI+BX]:物理地址 = 16×(DS)+(DI)+(BX)。
- ADD AX,[DI]:物理地址 = 16×(DS)+(DI)。
- ADD AX,6 [DI]:物理地址 = 16×(DS)+(DI)+6。
- SUB AX,[200H]:物理地址 = 16×(DS)+200H。
- CMP AX,1000H:物理地址 = 16×(DS)+1000H。
四、指令系统
(一)数据传送指令
- MOV 指令:
- 功能:将 SRC 内容送到 DST,SRC 可为常数、寄存器、内存地址;DST 可为寄存器、内存地址。
- 禁忌:DST 不可为 CS 或 IP;禁止两操作数同时为存储器地址。
- 常见语法错误(含总结要点):
- 操作数类型不一致(例:MOV AL,CX)。
- 无法确定字节 / 字操作(需指定类型,例:MOV BYTE PTR [BX+SI],5)。
- 两操作数均为存储器操作数(例:MOV BUF1,BUF2,需用 AX 中转)。
- 段寄存器操作限制:立即数不可直接赋值;CS 不可作为目的操作数。
- 堆栈操作指令:
- PUSH 指令:SP=SP-2,将源操作数压入堆栈。示例:(SS)=2000H,(SP)=0100H,(AX)=2107H,执行 PUSH AX 后,(SP)=00FEH,07H 存于物理地址 200FEH。
- POP 指令:将堆栈内容弹出到 DST,SP=SP+2;POPF 指令从栈中弹出数据到标志寄存器。
- 其他传送指令:
- XCHG 指令:交换 DST 和 SRC 内容,不可同时为内存地址,不可为 CS 或 IP。
- IN/OUT 指令:IN 读取端口数据到 AL/AX(例:IN AL,80H;IN AX,DX);OUT 将 AL/AX 数据写入端口(例:OUT DX,AL/AX),仅 AL/AX 可存放 I/O 数据。
- LEA 指令:将内存地址赋给目的操作数,不影响进位标志位(例:LEA DX,[1000H])。
(二)算术与逻辑指令
- 算术指令:
- ADD(加法):可能影响 CF 标志位(例:ADD BL,[AL])。
- SUB(减法):可能影响 SF 标志位(例:SUB AX,BX)。
- CMP(比较):隐含减法操作,不修改操作数,修改 OF、SF、ZF、CF、AF、PF 标志位。
- INC(加 1):影响 SF、AF、ZF、PF、OF,不影响 CF(例:INC CX)。
- 逻辑指令:
- AND(按位与):0 与任何数相与为 0;可用于清零(例:AND AX,0)。
- OR(按位或):例:OR AL,AL(不改变寄存器内容)。
- TEST(按位与):仅设置标志位,不改变操作数。
- NOT(按位取反):例:NOT AL(AL 按位取反后送回 AL)。
- XOR(异或):可用于清零(例:XOR AX,AX)。
- 移位指令:
- SAR(算术右移):符号位保持不变,用于有符号数除法(例:SAR AL,1 相当于除以 2)。
- SHL(逻辑左移):最高位移入 CF,最低位补 0(例:SHL AX,1)。
(三)条件转移与中断指令
- 条件转移指令:
- JNZ/JNE DST:ZF=0 时转移。
- JC NEXT:CF=1 时转移。
- JMP NEXT:跳转指令,不改变 CF。
- 软件中断指令:
- INT3:1 字节长,用于设置断点,执行时产生中断请求,调试器替换断点指令并获取 CPU 控制权。
五、伪指令
(一)定义与作用
- 特性:不可执行,不属于 CPU 指令系统,仅指示编译程序编译方式。
- 常见类型:
- 常量定义:STR EQU Num。
- 变量定义:DB(定义字节)、DW(定义字)。
- 重复定义:DUP(例:VAR2 DB 10DUP (34H,2 DUP (?)))。
- 段关联:ASSUME DS:DATA(编译时不产生指令代码)。
(二)变量定义示例(含详细解析)
- BUF DW 12,34,56,78:定义双字数组,每个元素占 2 字节,共 4×2=8 字节。
- LL DB 5:定义字节变量,初始化为 5,占 1 字节。
- VAR2 DB 10DUP(34H,2 DUP(?)):
- 含义:重复 “34H+2 个未初始化字节” 的模式 10 次。
- 空间计算:每次重复占 3 字节,共 10×3=30 字节;“?” 表示计算机任意分配。
六、标志寄存器
(一)状态标志(条件标志)
| 标志位 | 英文全称 | 功能说明 | =1 含义 | =0 含义 |
|---|---|---|---|---|
| CF | Carry Flag | 最高位进位 / 借位 | CY(有进位) | NC(无进位) |
| PF | Parity Flag | 结果低 8 位 “1” 的奇偶性 | PE(偶数个 1) | PO(奇数个 1) |
| AF | Auxiliary Carry Flag | 低 4 位向高 4 位(字节操作)或低字节向高字节(字操作)进位 / 借位 | AC(有进位) | NA(无进位) |
| ZF | Zero Flag | 运算结果是否为 0 | ZR(结果为 0) | NZ(结果非 0) |
| SF | Sign Flag | 运算结果符号(与最高位一致) | NG(结果为负) | PL(结果非负) |
| OF | Overflow Flag | 有符号数加减运算是否溢出 | OV(溢出) | NV(未溢出) |
(二)控制标志
| 标志位 | 英文全称 | 功能说明 | 操作指令 |
|---|---|---|---|
| IF | Interrupt Flag | 控制可屏蔽中断 | STI(置 1,允许中断)、CLI(置 0,禁止中断) |
| DF | Direction Flag | 字符串操作指针调整方向 | STD(置 1,减少)、CLD(置 0,增加) |
| TF | Trace Flag | 单步调试 | - |
(三)影响标志位的指令
- 影响状态标志:
- 是:CMP、SUB、ADD、INC、TEST、POPF 等。
- 否:IN、OUT、JMP 等。
- 影响控制标志:
- 是:STI、CLD、POPF 等。
- 否:ADD、OUT 等。
- 影响 CF 标志位:
- 是:ADD、SHL、SUB 等。
- 否:INC、JMP、JC 等。
七、Pentium 保护模式相关
(一)地址转换流程
- 提取逻辑地址中的段选择符和 32 位偏移量。
- 从段选择符指向的段描述符中获取 32 位段线性基地址。
- 线性基地址加偏移量得到物理地址。
(二)段选择符与描述符表
- 段选择符:16 位可见部分,其中 D2 位(TI 字段)用于选择全局描述符表(GDT,TI=0)或局部描述符表(LDT,TI=1)。
- 描述符表:
- 全局描述符表(GDT):由段描述符组成,由系统程序生成。
- 段描述符:64 位(8B),含段属性、基址、大小、访问控制信息,分为程序段(代码段、数据段、堆栈段)和系统段描述符。
(三)关键描述符字段
- 段界限字段:定义段的大小规模。
- P 字段:段是否调入内存(P=1 有效,P=0 无效)。
- DPL 字段:段特权级(0 级最高,3 级最低)。
- G 字段:段界限单位(G=1 时以 4KB 为单位)。
- AVL 字段:系统软件是否可用本段。
(四)门描述符
- 功能:控制程序 / 任务转移,自动进行保护检查,指定目标代码段入口点。
- 类型:调用门、任务门、中断门、陷阱门。
八、关键计算与规则
(一)存储与寻址相关计算
- 存储单元地址数:2^(CPU 地址数 - 使用的地址数)。
- 寻址范围:存储容量 / 字长。
- 译码器输出线:
- 单译码方式:2ⁿ(n 为地址输入线数),例:6 位地址输入输出 64 条线。
- 双译码方式:地址线分组,输出线数为两组之和,例:6 位地址分两组 3 位,输出 8+8=16 条线。
(二)Cache 与 DRAM 相关计算
- Cache 平均访问时间 = 命中率 ×Cache 访问时间 +(1 - 命中率)× 主存访问时间。
- CPU 平均访问时间 = 总的存取时间 / 总的访问次数。
- DRAM 刷新:
- 刷新单位:行。
- 集中刷新:刷新周期内集中逐行刷新,存在 “死时间”。
- 分散刷新:每个存取周期拆分读写和刷新,无死时间但系统速度降低。
- 异步刷新:2ms 内刷新所有行,每行刷新间隔 = 2000us / 行数(例:128 行间隔 15.6us)。
- 相邻两行的刷新间隔 = 最大刷新间隔 / 行数。
(三)单位换算
- 8bit=1B;1KB=1024B;1MB=1024KB;1GB=1024MB;1TB=1024GB。
九、8086CPU 补充特性
- 功能划分:总线接口单元和执行单元。
- 总线特性:内外部数据总线 16 位;20 位地址总线,低 16 位管理 64KB I/O 端口空间。
- 工作模式:可通过引脚信号设置为最小 / 最大工作模式。
十、汇编语言指令 - 标志位影响对照表
| 指令类型 | 指令示例 | CF(进位标志) | PF(奇偶标志) | AF(辅助进位标志) | ZF(零标志) | SF(符号标志) | OF(溢出标志) | IF(中断标志) | DF(方向标志) | TF(跟踪标志) |
|---|---|---|---|---|---|---|---|---|---|---|
| 数据传送 | MOV AX,BX | - | - | - | - | - | - | - | - | - |
| 数据传送 | PUSH AX | - | - | - | - | - | - | - | - | - |
| 数据传送 | POP AX | - | - | - | - | - | - | - | - | - |
| 数据传送 | POPF | √(随栈数据变化) | √(随栈数据变化) | √(随栈数据变化) | √(随栈数据变化) | √(随栈数据变化) | √(随栈数据变化) | √(随栈数据变化) | √(随栈数据变化) | √(随栈数据变化) |
| 数据传送 | XCHG AX,DX | - | - | - | - | - | - | - | - | - |
| 数据传送 | IN AL,80H | - | - | - | - | - | - | - | - | - |
| 数据传送 | OUT DX,AL | - | - | - | - | - | - | - | - | - |
| 数据传送 | LEA DX,[1000H] | - | - | - | - | - | - | - | - | - |
| 算术运算 | ADD AX,BX | √ | √ | √ | √ | √ | √ | - | - | - |
| 算术运算 | SUB AX,BX | √ | √ | √ | √ | √ | √ | - | - | - |
| 算术运算 | CMP AX,BX | √ | √ | √ | √ | √ | √ | - | - | - |
| 算术运算 | INC CX | - | √ | √ | √ | √ | √ | - | - | - |
| 逻辑运算 | AND AX,0 | - | √ | - | √ | √ | - | - | - | - |
| 逻辑运算 | OR AL,AL | - | √ | - | √ | √ | - | - | - | - |
| 逻辑运算 | TEST AX,BX | - | √ | - | √ | √ | - | - | - | - |
| 逻辑运算 | NOT AL | - | - | - | - | - | - | - | - | - |
| 逻辑运算 | XOR AX,AX | - | √ | - | √ | √ | - | - | - | - |
| 移位运算 | SHL AX,1 | √ | √ | - | √ | √ | √ | - | - | - |
| 移位运算 | SAR AL,1 | √ | √ | - | √ | √ | √ | - | - | - |
| 条件转移 | JNZ DST | - | - | - | - | - | - | - | - | - |
| 条件转移 | JC NEXT | - | - | - | - | - | - | - | - | - |
| 无条件转移 | JMP NEXT | - | - | - | - | - | - | - | - | - |
| 控制标志操作 | STI | - | - | - | - | - | - | √(置 1) | - | - |
| 控制标志操作 | CLI | - | - | - | - | - | - | √(置 0) | - | - |
| 控制标志操作 | STD | - | - | - | - | - | - | - | √(置 1) | - |
| 控制标志操作 | CLD | - | - | - | - | - | - | - | √(置 0) | - |
| 中断指令 | INT3 | - | - | - | - | - | - | - | - | - |
注:“√” 表示指令会影响该标志位(含置 1、置 0 或随运算结果变化);“-” 表示指令不影响该标志位;“随栈数据变化” 表示 POPF 指令会将栈中数据写入标志寄存器,使所有标志位跟随栈数据更新。
十一、x86 汇编核心指令汇总
(一)数据传送类指令
| 指令 | 功能说明 | 示例 | 关键注意事项 |
|---|---|---|---|
| MOV DST,SRC | 将源操作数送入目的操作数 | MOV AX,BX、MOV BYTE PTR[BX+SI],5 | 禁止两操作数均为存储器;DST 不可为 CS/IP;段寄存器不可直接赋值立即数 |
| PUSH SRC | 栈指针减 2,将源操作数压栈 | PUSH AX | 配合 SS 和 SP 确定栈地址,字操作 |
| POP DST | 从栈中取出数据送入目的操作数,栈指针加 2 | POP AX、POPF | POPF 直接修改标志寄存器所有位 |
| XCHG DST,SRC | 交换两操作数内容 | XCHG AX,DX | 不可同时为存储器地址;不可为 CS/IP |
| IN AL/AX, 端口 | 从 I/O 端口读取数据到 AL/AX | IN AL,80H、IN AX,DX | 仅 AL/AX 可作为数据寄存器 |
| OUT 端口,AL/AX | 将 AL/AX 数据写入 I/O 端口 | OUT DX,AL | 端口地址超过 8 位时需用 DX 间接寻址 |
| LEA DST, 内存地址 | 将内存有效地址赋给目的操作数 | LEA DX,[1000H] | 不影响进位标志位,仅传地址非数据 |
(二)算术运算类指令
| 指令 | 功能说明 | 示例 | 标志位影响 |
|---|---|---|---|
| ADD DST,SRC | 两操作数相加,结果送 DST | ADD AX,[DI+BX]、ADD BL,[AL] | 影响 CF、PF、AF、ZF、SF、OF |
| SUB DST,SRC | 目的操作数减源操作数,结果送 DST | SUB AX,BX、SUB AX,[200H] | 影响 CF、PF、AF、ZF、SF、OF |
| CMP DST,SRC | 隐含减法,不修改操作数,仅置标志位 | CMP AX,BX、CMP AX,1000H | 影响 CF、PF、AF、ZF、SF、OF |
| INC OPR | 操作数加 1 | INC CX、INC BYTE PTR[25H] | 影响 PF、AF、ZF、SF、OF,不影响 CF |
(三)逻辑与移位类指令
| 指令 | 功能说明 | 示例 | 标志位影响 |
|---|---|---|---|
| AND DST,SRC | 按位与,结果送 DST | AND AX,0、AND AL,200H | 影响 PF、ZF、SF,不影响 CF、AF、OF |
| OR DST,SRC | 按位或,结果送 DST | OR AL,AL | 影响 PF、ZF、SF,不影响 CF、AF、OF |
| TEST DST,SRC | 按位与,仅置标志位,不修改操作数 | TEST AX,BX | 影响 PF、ZF、SF,不影响 CF、AF、OF |
| NOT OPR | 按位取反,结果送原操作数 | NOT AL | 不影响任何标志位 |
| XOR DST,SRC | 按位异或,结果送 DST | XOR AX,AX | 影响 PF、ZF、SF,不影响 CF、AF、OF |
| SHL OPR,1/CL | 逻辑左移,最高位移入 CF,最低位补 0 | SHL AX,1 | 影响 CF、PF、ZF、SF、OF |
| SAR OPR,1/CL | 算术右移,符号位不变,最低位移入 CF | SAR AL,1 | 影响 CF、PF、ZF、SF、OF |
(四)转移与中断类指令
| 指令 | 功能说明 | 示例 | 标志位影响 |
|---|---|---|---|
| JMP DST | 无条件跳转 | JMP NEXT | 不影响任何标志位 |
| JNZ/JNE DST | 零标志 ZF=0 时跳转 | JNZ LABEL | 不影响标志位,仅根据标志位判断 |
| JC DST | 进位标志 CF=1 时跳转 | JC NEXT | 不影响标志位,仅根据标志位判断 |
| INT3 | 软件断点中断,产生中断请求 | INT3 | 不影响标志位,触发调试器接管 |
(五)控制标志操作指令
| 指令 | 功能说明 | 示例 | 作用对象 |
|---|---|---|---|
| STI | 中断标志 IF 置 1,允许可屏蔽中断 | STI | IF(中断标志) |
| CLI | 中断标志 IF 置 0,禁止可屏蔽中断 | CLI | IF(中断标志) |
| STD | 方向标志 DF 置 1,字符串操作指针递减 | STD | DF(方向标志) |
| CLD | 方向标志 DF 置 0,字符串操作指针递增 | CLD | DF(方向标志) |
| CLC | 进位标志 CF 置 0 | CLC | CF(进位标志) |
更多推荐

所有评论(0)