一、通用硬性规则所有算术 / 逻辑指令ADD SUB AND OR XOR CMP规则 1不支持「内存 ↔ 内存」双内存操作mem, mem全系列算术指令都禁止两个操作数同时为内存单元asm; 全部非法 add [bx], [si] add c[0], asm[0] sub num1, num2 cmp data1, data2 mov [0200h], [0300h]✅ 正确做法用寄存器中转asmmov ax, num1 add ax, num2规则 2段寄存器 CS/DS/ES/SS 不能直接参与算术运算段寄存器只能做 MOV 源 / 目标不能加减比较asm; 非法 add ds, ax sub ss, 100 cmp cs, es✅ 正确先给通用寄存器再运算asmmov ax, ds add ax, 20h规则 3段寄存器之间不能直接互传asmmov ds, es ; 非法 mov ss, cs ; 非法✅ 正确通用寄存器中转asmmov ax, es mov ds, ax规则 4IP 指令指针寄存器不能读写、运算IP 只能 CPU 自动修改程序无权访问asmmov ax, ip add ip, 2❌ 全部非法无任何修改 IP 的直接指令二、MOV 指令专属非法写法1. 立即数不能直接送入段寄存器asmmov ds, data ; 合法data是段标号段基址常量 mov ds, 2000h ; 非法立即数不能直接给段寄存器✅ 中转寄存器asmmov ax, 2000h mov ds, ax2. 不能给 CS 直接赋值会改变代码段禁止直接修改asmmov cs, ax ; 非法切换代码段只能用jmp far ptr远跳转3. 操作数位数不匹配字 / 字节冲突8 位寄存器 (ah/al/bl) 和 16 位寄存器 / 内存不能直接混用不加 ptr 报错asmmov al, [bx] ; 合法8位 mov ax, [bx] ; 合法16位 mov al, 1234h ; 非法16位立即数送入8位寄存器 mov [bx], 5 ; 模糊长度编译报错必须加word/byte ptr✅ 修正asmmov byte ptr [bx], 5 mov word ptr [bx], 1234h三、算术指令 (ADD/SUB/MUL/DIV) 专属非法写法1. 8/16 位乘除限制MUL 乘法只能单操作数asmmul ax, bx ; 非法mul只有一个源操作数 mul bx ; 合法DX:AX AX * BXDIV 除法不能除以立即数asmdiv 5 ; 非法 div cx ; 合法AX DXAX / CXDX存余数✅ 除以常数要先放入寄存器asmmov bx, 5 div bx2. 移位指令 SHL/SHR/SAL/SAR移位次数大于 1 时不能直接写数字必须用 CL 存次数asmshl ax, 3 ; 8086CPU非法 mov cl, 3 shl ax, cl ; 合法四、栈指令 PUSH/POP 非法写法不能 push/pop 8 位寄存器asmpush al ; 非法栈操作只能16位 pop ah不能 push 立即数8086 原版不支持asmpush 1234h ; 标准8086非法✅ 替代asmmov ax, 1234h push ax不能 pop CS、IPasmpop cs ; 非法 pop ip五、跳转、循环类易错非法LOOP 循环计数器只能用 CX不能用 BX/AXasmmov bx, 8 s: ... loop s ; 非法loop固定依赖CX短跳转标号超出 ±128 字节范围编译报错短跳转距离限制add 内存单元, idata归类add ax, idata✅ reg,mem 合法add idata, 5✅ mem,imm 合法add idata1, idata2❌ mem,mem 非法双内存