微机原理判断指令是否正确【见的多了,你就懂了~】
1. 立即数不能作为目标操作数
- 错误示例:
MOV 1000H, BX
- 规则:立即数只能作为源操作数,不能直接赋值给寄存器或存储器。
2. 操作数位数必须匹配
- 错误示例:
MOV BX, CL
- 规则:两个操作数的位数必须一致,不能将16位寄存器与8位寄存器混用。
3. 需要指定存储器操作数的字节或字
- 错误示例:
INC [BX]
- 规则:在操作存储器时,必须明确指定操作数是字节还是字(
BYTE PTR
或WORD PTR
)。
4. 两个操作数不能同时为存储器操作数
- 错误示例:
MOV [BX], [6014H]
- 规则:在一条指令中,两个操作数不能同时为存储器地址。
5. 循环次数超过1必须使用CL寄存器
- 错误示例:
ROL AL, 2
- 规则:当循环次数超过1时,必须使用
CL
寄存器指定次数。
6. 段寄存器限制(特别是CS寄存器)
- 错误示例:
MOV CS, AX
- 规则:段寄存器(尤其是
CS
)通常只能作为源操作数,不能直接修改。
7. 基址变址相对寻址中的寄存器使用
- 错误示例:
MOV AL, [SI DI]
- 规则:基址寄存器只能是
BX/BP
,变址寄存器只能是SI/DI
,不能同时使用两个变址寄存器。
8. 立即数不能直接赋值给段寄存器
- 错误示例:
MOV DS, 0100H
- 规则:立即数不能直接赋值给段寄存器,需要通过中间寄存器实现。
9. 端口直接寻址范围
- 错误示例:
OUT 310H, AL
- 规则:端口直接寻址的范围应在
0~FFH
之间,超过此范围时必须使用DX
间接寻址。
10. ES和SS段寄存器结合的正确用法
- 正确示例:
MOV ES:[BX DI], AX
和MOV SS:[BX SI 100H], BX
- 规则:在进行段寄存器和偏移地址结合时,确保使用合法的寄存器组合。
11. 明确指定存储器操作数的类型
- 错误示例:
ADD [SI], 20H
- 规则:必须指定操作数是
BYTE PTR
或WORD PTR
。
12. 堆栈指令不能使用立即数
- 错误示例:
PUSH 2000H
- 规则:堆栈指令(如
PUSH
和POP
)的操作数不能是立即数。
13. 堆栈操作数类型限制
- 错误示例:
POP AL
- 规则:堆栈操作数必须是16位,不能是8位寄存器。
14. 端口间接寻址的寄存器限制
- 错误示例:
OUT BX, AL
- 规则:端口间接寻址的寄存器只能是
DX
。
15. 交换指令中的寄存器限制
- 错误示例:
XCHG CX, DS
- 规则:交换指令中不能涉及段寄存器。
16. ADD 指令要求两操作数等字长
- 错误示例:
ADD BYTE PTR [BP], 256
- 规则:在
ADD
指令中,操作数必须有相同的字长。
17. 寄存器操作数不能有段重设符
- 错误示例:
MOV DATA[SI], ES:AX
- 规则:寄存器操作数不能加段重设符,只能对存储器操作数使用段重设符。
18. 转移地址的字长要求
- 错误示例:
JMP BYTE PTR [BX]
- 规则:转移地址的字长至少应是16位,不能使用8位地址。
19. 输出指令的端口地址要求
- 错误示例:
OUT 230H, AX
- 规则:端口地址超出8位范围时,必须用
DX
间接寻址。
20. MUL 指令不允许使用立即数
- 错误示例:
MUL 39H
- 规则:MUL 指令的操作数不能是立即数。
21. 操作数类型的指定要求
- 错误示例:
INC [BP]
- 规则:在某些指令中必须指定操作数的类型,如
INC [BP]
需要BYTE PTR
或WORD PTR
。
总结:
- 立即数限制:立即数不能作为目标操作数,且不能直接赋值给段寄存器。
- 操作数位数匹配:操作数位数必须一致。
- 存储器操作数限制:两个操作数不能同时为存储器地址。
- 段寄存器限制:段寄存器通常只能作为源操作数。
- 堆栈指令要求:堆栈操作数必须是16位,且不能是立即数。
- 寻址模式限制:基址和变址寄存器的组合必须合法。
- 端口操作限制:端口直接寻址必须在0~FFH范围内,超出需用DX间接寻址。
- 操作数类型明确性:某些指令必须明确指定操作数的类型。
- 特定指令限制:如
MUL
不允许立即数,XCHG
不能涉及段寄存器。
通过这些规则可以系统化地判断一条指令的正确性。