汇编语言期末复习完全指南
这份教程按照为什么这样设计 → 底层逻辑是什么 → 具体怎么用的思路编写不仅罗列指令更注重理解计算机工作的本质逻辑。第一章为什么要学汇编——从机器视角看世界1.1 高级语言 vs 汇编语言的本质差异维度C/Python 等高级语言汇编语言抽象层级面向问题if/else、for面向机器寄存器、内存地址执行主体程序员描述做什么程序员指挥怎么做硬件可见性完全屏蔽完全暴露可移植性高换平台重新编译极低绑定特定 CPU 架构核心逻辑汇编不是另一种语法而是直接控制硬件的工作流程。每一条指令都对应 CPU 的一个具体动作。1.2 计算机执行程序的本质模型所有程序最终都归结为冯·诺依曼模型的循环取指令 (Fetch) → 译码 (Decode) → 执行 (Execute) → 回写 (Write-back)逻辑要点CPU 不认识变量名、函数名它只认识二进制机器码汇编是机器码的人类可读形式助记符程序 指令序列 数据序列都存放在同一片内存中CPU 通过CS:IP代码段:指令指针知道下一条指令在哪第二章数的表示与运算——一切的基础2.1 进制系统为什么计算机用二进制物理逻辑电子元件最容易表示两种稳定状态高电平/低电平、有磁/无磁、有光/无光。多态表示如十进制对硬件精度要求极高容易出错。关键换算关系必须熟记二进制十六进制十进制000000000111………1000881001991010A101011B111100C121101D131110E141111F15为什么汇编里十六进制最常用二进制写太长1111 1111 8 位十六进制刚好 1 位对应 4 位二进制FF1111 1111一个字节8 位 两位十六进制非常直观2.2 有符号数的表示补码机制极其重要问题8 位寄存器能表示 0~255如何表示负数设计逻辑最高位作为符号位0正1负但简单符号位原码有问题0000 0001(1) 1000 0001(-1) 1000 0010(-2)运算结果错误补码解决方案正数不变负数按位取反 1为什么补码能正确运算数学原理在模 256 的系统中-x的等价表示是256 - x。-1的补码 256 - 12551111 1111(FF)3 (-1)0000 00111111 11111 0000 0010溢出位丢弃0000 0010 2 ✅溢出判断逻辑无符号溢出结果超出 0~255看CF进位标志有符号溢出正正负 或 负负正看OF溢出标志第三章8086 CPU 架构与寄存器系统3.1 寄存器设计的核心逻辑为什么需要寄存器内存访问速度 CPU 运算速度寄存器位于 CPU 内部速度极快寄存器是零延迟的临时工作空间3.2 通用寄存器重点掌握8086 有 14 个 16 位寄存器分为几类数据寄存器AX, BX, CX, DX寄存器全称默认用途可拆分AXAccumulator累加器乘除法默认操作数I/O 操作AH高8位 AL低8位BXBase基址寄存器常用于内存寻址BH BLCXCount计数器LOOP指令默认使用CH CLDXData数据寄存器乘除法辅助I/O 端口地址DH DL设计逻辑为什么 AX 是默认累加器早期 CPU 指令编码长度有限隐含使用 AX 可以缩短指令长度提高执行效率乘除法结果通常很长AX及 DX成对使用存放结果指针与变址寄存器寄存器名称核心用途SPStack Pointer栈顶指针始终指向栈顶BPBase Pointer栈基址指针访问栈中局部变量SISource Index源变址串操作源地址DIDestination Index目的变址串操作目的地址SP vs BP 的逻辑区别SP是动态的随PUSH/POP/CALL/RET自动变化指向当前栈顶BP是静态的在子程序中通常固定指向栈帧底部通过BP偏移访问参数和局部变量段寄存器理解内存分段的关键寄存器名称配合的偏移寄存器用途CSCode SegmentIP代码段存放指令DSData SegmentSI, DI, BX, 直接地址数据段存放变量SSStack SegmentSP, BP栈段存放临时数据ESExtra SegmentDI串操作时附加段辅助数据操作3.3 物理地址的形成逻辑必考问题8086 是 16 位 CPU寄存器 16 位如何访问 20 位地址空间1MB 2^20解决方案分段机制物理地址 段地址 × 16 偏移地址 段地址左移 4 位 偏移地址举例段地址2000H偏移1234H物理地址 20000H1234H21234H为什么这样设计16 位寄存器只能存 0~FFFFH64KB通过段:偏移组合实现 1MB 寻址程序可以重定位只需改变段寄存器同一段代码可在不同物理位置运行注意一个物理地址可由多组段:偏移表示。例如21234H2000:12342100:02342123:00042120:0034第四章寻址方式——如何找到操作数4.1 为什么需要多种寻址方式核心逻辑操作数可能存放在不同位置CPU 需要知道去哪里取数。不同寻址方式对应不同的编码长度和执行速度。4.2 七种寻址方式详解1. 立即寻址ImmediateMOV AX, 3064H逻辑操作数直接包含在指令中特点速度快无需内存访问但只能用于源操作数限制立即数不能作为目的操作数不能向常数赋值2. 寄存器寻址RegisterMOV AX, BX逻辑操作数在寄存器中特点速度最快零等待周期注意源和目的位数必须一致不能MOV AX, BL3. 直接寻址DirectMOV AX, [2000H]逻辑指令中给出内存的偏移地址默认段为 DS实际物理地址DS × 16 2000H方括号[]的逻辑表示取内存中的值而非立即数4. 寄存器间接寻址Register IndirectMOV AX, [BX] ; 或 [SI], [DI]逻辑寄存器中存放的是地址而非数据适用寄存器BX, SI, DI, BP默认段规则使用 BX/SI/DI → 默认 DS 段使用 BP → 默认 SS 段因为 BP 通常操作栈5. 寄存器相对寻址Register RelativeMOV AX, [BX10H] ; 也可写成 [10HBX] 或 10H[BX]逻辑有效地址 寄存器值 位移量用途访问结构体成员、数组元素、局部变量示例逻辑结构体基地址在 BX偏移 10H 处是某个字段6. 基址变址寻址Based IndexedMOV AX, [BXSI] ; 或 [BXDI]逻辑有效地址 基址寄存器 变址寄存器典型用途二维数组访问BX 行基址SI 列偏移7. 相对基址变址寻址Relative Based IndexedMOV AX, [BXSI10H]逻辑有效地址 基址 变址 位移用途复杂数据结构如结构体数组中的某个字段4.3 寻址方式速查表寻址方式示例有效地址 EA指令长度速度立即MOV AX, 5无短最快寄存器MOV AX, BX无短最快直接MOV AX, [100H]100H中慢访存寄存器间接MOV AX, [BX](BX)短慢寄存器相对MOV AX, [BX5](BX)5中慢基址变址MOV AX, [BXSI](BX)(SI)短慢相对基址变址MOV AX, [BXSI5](BX)(SI)5中最慢第五章数据传送指令——程序的血液流动5.1 MOV 指令的深层逻辑MOV 目的操作数, 源操作数逻辑将源操作数的值复制到目的操作数源不变。限制规则考试常考规则原因不能同时为段寄存器硬件设计限制如不能MOV DS, ES不能同时为内存操作数指令编码无法表示两个地址立即数不能直接送段寄存器需通过通用寄存器中转目的不能是立即数逻辑上不能向常数赋值源目长度必须一致硬件按字节/字传输正确示例MOV AX, DATA_SEG ; 立即数→通用寄存器 MOV DS, AX ; 通用寄存器→段寄存器中转 MOV AL, [BX] ; 内存→寄存器 MOV [DI], DX ; 寄存器→内存5.2 堆栈操作指令PUSH / POP堆栈的逻辑模型一段特殊的内存区域后进先出LIFOSS:SP 始终指向栈顶栈向低地址方向生长压栈时 SP 减小PUSH AX ; SP SP - 2, 然后 [SP] AX POP BX ; BX [SP], 然后 SP SP 2为什么是 SP-2 而不是 SP-18086 按**字16 位**操作栈压入一个字 2 个字节所以 SP 减 2栈的应用逻辑临时保存寄存器子程序开头 PUSH结尾 POP传递参数调用前 PUSH 参数保存返回地址CALL 指令自动 PUSH IP5.3 交换指令 XCHGXCHG AX, BX ; AX 和 BX 的值互换 XCHG AL, [SI] ; AL 和内存单元互换逻辑两操作数互换不能使用立即数。5.4 地址传送指令LEA / LDS / LESLEALoad Effective AddressLEA BX, [SI10H] ; BX SI 10H不是取内容与 MOV 的本质区别LEA BX, [SI10H]→ BX 得到的是地址值MOV BX, [SI10H]→ BX 得到的是该地址的内容LDS / LESLDS SI, [BX] ; SI [BX], DS [BX2]逻辑从内存取一个 32 位地址16 位偏移 16 位段地址常用于加载远指针段:偏移5.5 标志传送指令LAHF ; AH FLAGS 的低 8 位SF,ZF,AF,PF,CF SAHF ; FLAGS 低 8 位 AH PUSHF ; 标志寄存器压栈 POPF ; 标志寄存器弹栈用途保存/恢复程序状态或手动修改标志位。第六章算术运算指令——CPU 如何计算6.1 加法指令ADD普通加法ADD AX, BX ; AX AX BX影响所有标志位标志位变化逻辑CF无符号溢出最高位进位OF有符号溢出ZF结果为零SF结果为负最高位为 1AF辅助进位低 4 位向高 4 位进位用于 BCD 运算PF低 8 位中 1 的个数为偶数ADC带进位加法ADC AX, BX ; AX AX BX CF设计逻辑用于多精度运算。例如 32 位数相加; 假设 DX:AX 12345678H, BX:CX 9ABCDEF0H ADD AX, CX ; 低 16 位相加产生进位到 CF ADC DX, BX ; 高 16 位相加加上低位的进位INC自增INC AX ; AX AX 1不影响 CF影响其他标志位为什么不影响 CF便于在循环中保持 CF 状态6.2 减法指令SUB普通减法SUB AX, BX ; AX AX - BXSBB带借位减法SBB AX, BX ; AX AX - BX - CF逻辑多精度减法处理低位借位DEC自减DEC CX ; CX CX - 1不影响 CFCMP比较指令——极其重要CMP AX, BX ; 做 AX - BX但不保存结果只影响标志位逻辑本质执行减法但不回写专门用于设置标志位供后续条件跳转使用。标志位解读关系无符号解释有符号解释AX BXZF 1ZF 1AX BXCF 0 且 ZF 0ZF 0 且 SF OFAX BXCF 1SF ≠ OF6.3 乘法指令MUL无符号乘法MUL BL ; AL × BL → AX MUL BX ; AX × BX → DX:AX高 16 位在 DX低 16 位在 AXIMUL有符号乘法IMUL BX ; 同上但操作数视为有符号数为什么结果放 DX:AX16 位 × 16 位 最大需要 32 位存放结果DX 存高 16 位AX 存低 16 位标志位CFOF1 表示结果高半部分非零对于 MUL或符号扩展对于 IMUL。6.4 除法指令DIV无符号除法DIV BL ; AX ÷ BL商 → AL余数 → AH DIV BX ; DX:AX ÷ BX商 → AX余数 → DXIDIV有符号除法余数符号与被除数相同除法溢出问题如果商超出目标寄存器容量产生除法溢出中断例如DIV BL时若 AX 255×BL则溢出6.5 BCD 调整指令了解即可AAA ; 加法后 ASCII 调整 DAA ; 加法后十进制调整 AAS ; 减法后 ASCII 调整 DAS ; 减法后十进制调整 AAM ; 乘法后 ASCII 调整 AAD ; 除法前 ASCII 调整存在逻辑早期计算机需直接处理十进制数现代编程极少使用。第七章逻辑运算与移位指令——位操作的艺术7.1 逻辑运算指令AND按位与AND AL, 0FH ; 屏蔽高 4 位保留低 4 位逻辑应用清零特定位与 0保留特定位与 1。OR按位或OR AL, 80H ; 将最高位置 1逻辑应用置位特定位或 1保留特定位或 0。XOR异或XOR AX, AX ; 清零 AX比 MOV AX, 0 更快更短 XOR AL, 0FFH ; 按位取反经典应用寄存器清零自身异或、简单加密、交换两数XOR AX, BX XOR BX, AX XOR AX, BX ; 无需临时变量交换两数NOT取反NOT AX ; 所有位翻转不影响任何标志位唯一不修改标志的逻辑指令TEST测试TEST AL, 80H ; 测试最高位是否为 1AL 80H不保存结果逻辑与 CMP 类似专门用于位测试不破坏操作数。7.2 移位指令逻辑移位SHL / SHRSHL AX, 1 ; 左移 1 位最低位补 0最高位 → CF SHR AX, CL ; 右移 CL 位SHL 的数学意义左移 1 位 乘以 2SHR 的数学意义右移 1 位 无符号除以 2算术移位SAL / SARSAL AX, 1 ; 与 SHL 完全相同 SAR AX, 1 ; 右移最高位保持不变符号位为什么需要 SAR有符号数右移时符号位必须保持否则负数变正数例如-811111000SAR 后 11111100(-4) ✅若用 SHR01111100(124) ❌循环移位ROL / ROR / RCL / RCRROL AX, 1 ; 左循环最高位 → 最低位 和 CF ROR AX, 1 ; 右循环最低位 → 最高位 和 CF RCL AX, 1 ; 带进位左循环CF → 最低位最高位 → CF RCR AX, 1 ; 带进位右循环应用场景ROL/ROR位串循环处理生成校验码RCL/RCR多字移位配合 CF 传递进位第八章控制转移指令——改变执行流程8.1 无条件转移 JMPJMP SHORT LABEL ; 短转移-128 ~ 127 字节 JMP NEAR PTR LABEL ; 近转移同一段内 JMP FAR PTR LABEL ; 远转移跨段 JMP AX ; 寄存器间接转移 JMP [BX] ; 内存间接转移底层逻辑短转移指令中包含 8 位位移IP IP 位移相对跳转近转移指令中包含 16 位偏移IP 新偏移远转移指令中包含 16 位偏移 16 位段地址CS 和 IP 都改变为什么有短/近/远之分指令长度不同短转移只需 2 字节节省内存和取指时间汇编器自动选择最优编码程序员可用SHORT/NEAR PTR/FAR PTR强制指定8.2 条件转移指令基于标志位所有条件转移都是短转移-128~127这是 8086 设计限制。指令条件含义检查的标志JZ/JE结果为 0 / 相等Jump if Zero/EqualZF1JNZ/JNE结果非 0 / 不等Jump if Not Zero/Not EqualZF0JC有进位/借位Jump if CarryCF1JNC无进位Jump if No CarryCF0JO溢出Jump if OverflowOF1JNO无溢出Jump if Not OverflowOF0JS结果为负Jump if SignSF1JNS结果为正Jump if Not SignSF0JP/JPE低 8 位有偶数个 1Jump if Parity EvenPF1JNP/JPO低 8 位有奇数个 1Jump if Parity OddPF0无符号数比较使用 CF 和 ZF指令含义JA/JNBE高于/不低于等于Above/Not Below or EqualJAE/JNB高于等于/不低于JB/JNAE低于/不高于等于Below/Not Above or EqualJBE/JNA低于等于/不高于有符号数比较使用 SF, OF 和 ZF指令含义JG/JNLE大于/不小于等于Greater/Not Less or EqualJGE/JNL大于等于/不小于JL/JNGE小于/不大于等于Less/Not Greater or EqualJLE/JNG小于等于/不大于记忆逻辑A/B Above/Below → 无符号把数当纯二进制G/L Greater/Less → 有符号考虑正负8.3 循环控制指令LOOP LABEL ; CX CX - 1若 CX ≠ 0 则跳转 LOOPE/LOOPZ ; CX CX - 1若 CX ≠ 0 且 ZF1 则跳转 LOOPNE/LOOPNZ ; CX CX - 1若 CX ≠ 0 且 ZF0 则跳转 JCXZ LABEL ; 若 CX 0 则跳转LOOP 的底层逻辑自动递减 CX这是硬编码的行为检查 CX 是否为 0不为 0 则跳转回循环体典型结构MOV CX, 10 ; 循环 10 次 LOOP_START: ; 循环体 LOOP LOOP_START ; CX--若不为 0 继续8.4 子程序调用与返回CALL 指令CALL NEAR PTR SUB1 ; 近调用PUSH IP, IP 偏移地址 CALL FAR PTR SUB2 ; 远调用PUSH CS, PUSH IP, CS:IP 新地址 CALL AX ; 寄存器间接调用 CALL [BX] ; 内存间接调用逻辑调用子程序前必须保存返回地址以便子程序结束后能正确返回。RET 指令RET ; 近返回POP IP RET 4 ; 返回并 SP SP 4清理栈上参数 RET ; 远返回POP IP, POP CSRET n 的逻辑用于调用者清理参数的约定C 语言 pascal 调用约定。8.5 中断指令INT 21H ; 调用 21H 号中断DOS 功能调用 INTO ; 若 OF1 则触发 4 号中断溢出处理 IRET ; 中断返回POP IP, POP CS, POP FLAGS中断与 CALL 的区别CALL 是程序主动调用已知子程序INT 是调用中断向量表中的服务程序可硬件触发INT 额外保存 FLAGS因为中断可能随时发生需完整保存状态第九章串操作指令——批量数据处理9.1 串操作的设计逻辑问题如何高效处理连续内存数据字符串、数组方案用 SI/DI 自动指向数据用 CX 计数用 FLAGS 控制方向一条指令完成一次操作并自动指针移动。9.2 方向标志 DF 与 STD/CLDCLD ; DF 0地址递增SI/DI 增加 STD ; DF 1地址递减SI/DI 减少默认状态通常使用 CLD地址递增处理字符串从左到右。9.3 串操作指令族指令操作源目的重复前缀MOVS传送字节/字DS:SIES:DIREPLODS取到 AL/AXDS:SIAL/AX通常不用STOS存入 AL/AXAL/AXES:DIREPCMPS比较DS:SIES:DIREPE/REPNESCAS扫描AL/AXES:DIREPE/REPNE9.4 重复前缀REP ; 重复直到 CX 0 REPE/REPZ ; 重复直到 CX 0 或 ZF 0 REPNE/REPNZ ; 重复直到 CX 0 或 ZF 1典型应用示例1. 内存拷贝类似 memcpyCLD MOV CX, 100 ; 拷贝 100 个字 REP MOVSW ; 重复执行 MOVSW 直到 CX 0执行逻辑每次 MOVSW 做[DI] [SI]然后 SI2, DI2, CX–直到 CX0。2. 字符串比较CLD MOV CX, 20 REPE CMPSB ; 比较直到不等或 CX0 JNZ NOT_EQUAL ; ZF0 表示发现不同字符3. 查找字符CLD MOV CX, 100 MOV AL, A REPNE SCASB ; 在 ES:DI 指向的 100 字节中找 A JZ FOUND ; ZF1 表示找到了第十章伪指令与程序结构10.1 段定义伪指令DATA SEGMENT ; 定义数据段开始 BUF DB 100 DUP(0) ; 定义 100 字节缓冲区 DATA ENDS ; 数据段结束 CODE SEGMENT ASSUME CS:CODE, DS:DATA ; 告诉汇编器段寄存器对应关系 START: MOV AX, DATA MOV DS, AX ; 初始化 DS 段寄存器 ; 程序主体 MOV AH, 4CH INT 21H ; 返回 DOS CODE ENDS END START ; 程序结束入口点为 STARTASSUME 的逻辑只是声明性的告诉汇编器在编译时如何解释符号地址不修改实际段寄存器值。所以程序开始时必须手动给 DS/ES 赋值。10.2 数据定义伪指令伪指令含义示例分配空间DBDefine ByteA DB 51 字节DWDefine WordB DW 1234H2 字节DDDefine DoublewordC DD 12345678H4 字节DQDefine Quadword8 字节DTDefine Ten Bytes10 字节字符串定义STR DB HELLO ; 分配 5 字节依次存放 48H, 45H, 4CH, 4CH, 4FH STR2 DB A, B, 0 ; 混合定义DUP 重复操作符BUF DB 100 DUP(0) ; 100 个 0 TAB DW 10 DUP(?) ; 10 个未初始化字 ARR DB 3 DUP(1, 2) ; 1,2,1,2,1,2重复整个序列10.3 符号定义EQU ; 等价不可重定义 PORT EQU 80H ; 编译时所有 PORT 替换为 80H ; 等号可重定义 COUNT 5 COUNT 10 ; 合法与变量的区别EQU 不分配内存只是文本替换。10.4 过程定义SUB1 PROC NEAR ; 近过程同段调用 PUSH AX ; 保护寄存器 ; 子程序体 POP AX ; 恢复寄存器 RET SUB1 ENDP SUB2 PROC FAR ; 远过程可跨段调用 ; 自动保存/恢复 CS:IP RET SUB2 ENDP第十一章DOS 功能调用——与操作系统交互11.1 调用机制MOV AH, 功能号 ; 选择具体功能 设置入口参数 ; 根据功能要求 INT 21H ; 触发中断 获取出口参数 ; 结果通常在 AX 或指定寄存器11.2 常用功能号速查AH功能入口参数出口参数01H键盘输入并回显无AL 字符02H显示字符DL 字符无07H键盘输入无回显无AL 字符08H键盘输入无回显检测 CtrlC无AL 字符09H显示字符串DS:DX 串地址$结尾无0AH输入字符串DS:DX 缓冲区首址缓冲区填充4CH返回 DOSAL 返回码无显示字符串示例DATA SEGMENT MSG DB Hello World$ ; 必须以 $ 结尾 DATA ENDS CODE SEGMENT MOV AX, DATA MOV DS, AX MOV DX, OFFSET MSG ; 或 LEA DX, MSG MOV AH, 09H INT 21H CODE ENDS输入字符串缓冲区格式[0] 最大允许长度需预先设置 [1] 实际输入长度由 DOS 填写 [2..n] 输入的字符内容第十二章程序设计逻辑与典型算法12.1 分支程序设计逻辑单分支CMP AX, 0 JGE NON_NEG ; 如果 AX 0 跳过 NEG AX ; 否则取反求绝对值 NON_NEG:双分支CMP AX, BX JGE AX_BIGGER ; AX BX 走这边 MOV MAX, BX ; 否则 BX 更大 JMP DONE AX_BIGGER: MOV MAX, AX DONE:多分支跳转表法MOV BX, 0 MOV BL, CHOICE ; 选择 0~3 SHL BX, 1 ; ×2因为地址是字 JMP TABLE[BX] ; 跳转到对应处理程序 TABLE DW CASE0, CASE1, CASE2, CASE312.2 循环程序设计计数循环MOV CX, N LOOP1: ; 循环体 LOOP LOOP1条件循环WHILE_START: CMP AX, 0 JLE WHILE_END ; while (AX 0) ; 循环体 JMP WHILE_START WHILE_END:12.3 子程序设计规范标准模板PROC_NAME PROC PUSH AX ; 保护所有要修改的寄存器除了传结果的 PUSH BX PUSH CX PUSH DX ; 子程序功能代码 POP DX ; 按相反顺序恢复 POP CX POP BX POP AX RET PROC_NAME ENDP参数传递方式方式实现优点缺点寄存器参数放 AX/BX/CX快速参数数量受限内存变量全局变量简单不可重入耦合高栈PUSH 参数CALL[BP4] 访问通用支持递归稍复杂栈参数访问示例; 调用前PUSH ARG2 / PUSH ARG1 / CALL SUM ; 栈状态[BP0]旧BP, [BP2]返回IP, [BP4]ARG1, [BP6]ARG2 SUM PROC PUSH BP MOV BP, SP ; BP 指向栈帧基址 MOV AX, [BP4] ; 取 ARG1 ADD AX, [BP6] ; 加 ARG2 POP BP RET 4 ; 返回并清理 4 字节参数 SUM ENDP第十三章标志位与条件判断深度理解13.1 FLAGS 寄存器结构15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 OF DF IF TF SF ZF AF PF CF位名称含义0CF进位/借位标志2PF奇偶标志4AF辅助进位6ZF零标志7SF符号标志8TF陷阱标志单步调试9IF中断允许10DF方向标志11OF溢出标志13.2 标志位变化规律总结指令类型影响的标志说明数据传送MOV/PUSH/POP/LEA无纯搬运加法/减法ADD/SUB/CMP全部按结果设置增量/减量INC/DEC除 CF 外保持 CF 用于多精度逻辑运算AND/OR/XOR/TESTCF0, OF0逻辑操作无进位溢出移位SHL/SHR/SARCF移出位按最后移出位设置循环移位ROL/RORCF移出位OF 视情况而定乘法MUL/IMULCF, OF表示结果是否需要高半部分除法DIV/IDIV不确定通常视为未定义标志操作CLC/STC/CMCCF专门操作 CF第十四章高频考点与易错点总结14.1 经典易错题1. MOV 指令合法性判断MOV [BX], [SI] ; ❌ 错误不能同时为内存操作数 MOV DS, 1000H ; ❌ 错误立即数不能直接送段寄存器 MOV AX, BL ; ❌ 错误长度不匹配 XCHG AX, [BXSI] ; ✅ 正确寄存器和内存可以交换2. 寻址方式识别MOV AX, [100H] ; 直接寻址 MOV AX, [BX10H] ; 寄存器相对寻址 MOV AX, [BXSI5] ; 相对基址变址寻址3. 段超越前缀MOV AX, CS:[BX] ; 强制使用 CS 段而非默认 DS MOV AX, SS:[SI] ; 强制使用 SS 段4. 栈操作细节PUSH AL ; ❌ 错误栈操作必须是字16位 PUSH AX ; ✅ 正确SP SP - 214.2 编程题常见模式1. 统计字符串中某字符出现次数MOV CX, STR_LEN MOV SI, OFFSET STRING MOV BL, 0 ; 计数器 MOV AL, A ; 目标字符 COUNT_LOOP: CMP AL, [SI] JNE NEXT INC BL NEXT: INC SI LOOP COUNT_LOOP2. 数组求和MOV CX, 100 MOV SI, 0 MOV AX, 0 ; 累加和 SUM_LOOP: ADD AX, ARRAY[SI] ADD SI, 2 ; 字数组每次 2 LOOP SUM_LOOP3. 冒泡排序核心MOV CX, N DEC CX ; 外层循环 N-1 次 OUTER: MOV DX, CX MOV SI, 0 INNER: MOV AX, ARRAY[SI] CMP AX, ARRAY[SI2] JLE NO_SWAP ; 升序若 则不交换 XCHG AX, ARRAY[SI2] MOV ARRAY[SI], AX NO_SWAP: ADD SI, 2 DEC DX JNZ INNER LOOP OUTER第十五章复习策略与考试技巧15.1 知识分层必须熟记肌肉记忆14 个寄存器名称、功能、可拆分性7 种寻址方式的名称和格式所有条件转移指令的助记符和判断条件常用 DOS 功能号01H, 02H, 09H, 0AH, 4CH必须理解能推导物理地址计算段×16偏移补码运算和溢出判断标志位变化规律栈的生长方向和操作细节必须掌握能编写完整程序框架段定义、初始化、返回 DOS分支、循环、子程序结构串操作 REP 前缀的使用简单算法实现求和、求最大最小、查找、排序15.2 答题技巧读程序题先标出每条指令修改了哪个寄存器/内存逐步跟踪写程序题先画流程图再写注释最后填指令寻址方式题先找[]再看里面成分判断类型标志位题先算出实际结果再逐位分析 CF/OF/ZF/SF祝你期末顺利如果有具体的题目或某条指令的疑惑随时可以问我深入讲解。相关问题如何在汇编语言中实现函数递归调用8086 的中断处理流程是怎样的如何优化汇编程序的执行效率现代CPU架构与8086的主要区别是什么汇编语言在嵌入式开发中的实际应用案例有哪些