一、计算机系统组成
-
计算机系统组成:由硬件系统和软件系统组成
- 硬件系统:CPU、存储器、输入/输出设备等物理部件
- 软件系统:操作系统、各种语言、系统软件和应用软件
-
汇编语言分类
- 属于低级语言(直接面向硬件)
- 与高级语言(面向问题)和机器语言(二进制代码)相区别
二、汇编程序开发过程
-
源文件扩展名
- .ASM:汇编语言源程序
- .OBJ:汇编后产生的目标文件
- .EXE:链接后生成的可执行文件
-
开发步骤:
- 编辑(.ASM)→ 汇编(.OBJ)→ 链接(.EXE)→ 执行
-
相关命令
- MASM:汇编命令,生成.OBJ和可选.LST文件
- LINK:链接命令,生成.EXE文件
三、8086/8088 CPU结构
-
CPU组成
- 运算器(ALU):算术逻辑运算
- 控制器:指令译码和执行控制
- 寄存器组:数据暂存和地址处理
-
寄存器分类:
- 通用寄存器(AX,BX,CX,DX,SI,DI,BP,SP)
- 段寄存器(CS,DS,SS,ES)
- 控制寄存器(IP,FLAGS)
-
寄存器位数
- 8位寄存器:AH,AL,BH,BL,CH,CL,DH,DL(共8个)
- 16位寄存器:AX,BX,CX,DX,SI,DI,BP,SP,CS,DS,SS,ES,IP,FLAGS(共14个)
四、标志寄存器(PSW)
-
标志位组成
- 条件状态位(6个):CF,PF,AF,ZF,SF,OF
- 控制状态位(3个):DF,IF,TF
-
各标志位含义:
- CF(进位标志):无符号数溢出
- PF(奇偶标志):结果低8位1的个数为偶数
- AF(辅助进位):BCD运算时低4位向高4位进位
- ZF(零标志):结果为0
- SF(符号标志):结果为负(最高位为1)
- OF(溢出标志):有符号数溢出
- DF(方向标志):串操作方向(0=递增,1=递减)
- IF(中断允许):是否允许可屏蔽中断
- TF(陷阱标志):单步执行
五、存储器组织
-
存储单元编址
- 按字节编址
- 1字节=8位
- 1字=2字节=16位
-
物理地址形成
- 物理地址 = 段地址×16 + 偏移地址
- 段地址左移4位(相当于×16)加偏移地址
-
逻辑地址与物理地址转换
- 例:236FH:1000H → 246F0H
- 计算方法:236F0H + 1000H = 246F0H
-
段寄存器使用规则
- 默认段选择:
- CS:代码段
- DS:数据段
- SS:堆栈段(BP作基址时使用)
- ES:附加段(串操作目的地址)
- 默认段选择:
六、寻址方式
-
寻址方式分类:
- 立即寻址:操作数在指令中
- 寄存器寻址:操作数在寄存器
- 存储器寻址:
- 直接寻址:[偏移地址]
- 寄存器间接:[BX/BP/SI/DI]
- 寄存器相对:[BX/BP/SI/DI + 位移量]
- 基址变址:[BX/BP + SI/DI]
- 相对基址变址:[BX/BP + SI/DI + 位移量]
-
转移地址寻址:
- 段内转移:只修改IP
- 段间转移:修改CS和IP
- 直接寻址:目标地址在指令中
- 间接寻址:目标地址在寄存器或内存
七、指令系统
-
数据传送指令:
- MOV:传送(不能直接段寄存器间传送)
- XCHG:交换(不能与段寄存器交换)
- PUSH/POP:堆栈操作(16位操作)
- LEA:取有效地址
- LDS/LES:装入远指针
-
算术运算指令:
- ADD/ADC:加法/带进位加
- SUB/SBB:减法/带借位减
- INC/DEC:加1/减1(不影响CF)
- NEG:求补(相当于0-操作数)
- MUL/IMUL:无/有符号乘法
- DIV/IDIV:无/有符号除法
-
逻辑运算指令:
- AND/OR/XOR/NOT:与/或/异或/非
- TEST:测试(相当于AND但不保存结果)
- SHL/SHR:逻辑左/右移
- SAL/SAR:算术左/右移
- ROL/ROR:循环左/右移
- RCL/RCR:带进位循环左/右移
-
串操作指令:
- MOVS/CMPS/SCAS/LODS/STOS
- 前缀:REP/REPE/REPNE
- 方向控制:CLD(DF=0)/STD(DF=1)
-
控制转移指令:
- JMP:无条件转移
- Jcc:条件转移(JA,JB,JE,JG,JL等)
- LOOP/LOOPE/LOOPNE:循环控制
- CALL/RET:子程序调用/返回
- INT/IRET:中断调用/返回
-
处理器控制指令:
- CLC/STC:清/置CF
- CLD/STD:清/置DF
- CLI/STI:清/置IF
- HLT/NOP:暂停/空操作
八、伪指令与程序结构
-
伪指令类型:
- 数据定义:DB/DW/DD(字节/字/双字)
- 符号定义:EQU/=(等值)/LABEL(类型重定义)
- 段定义:SEGMENT/ENDS
- 过程定义:PROC/ENDP
- 程序结束:END
-
程序结构:
DATA SEGMENT; 数据定义 DATA ENDSSTACK SEGMENT STACK; 堆栈定义 STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:; 程序代码MOV AH,4CHINT 21H CODE ENDSEND START
-
变量与标号:
- 变量:存储单元符号地址,有段、偏移和类型属性
- 标号:指令地址符号,有段、偏移和距离属性(NEAR/FAR)
九、中断与I/O
-
中断类型:
- 内部中断:除法错、单步、断点、溢出、指令中断
- 外部中断:NMI(非屏蔽)、INTR(可屏蔽)
-
中断向量表:
- 位于内存0000:0000~0000:03FFH
- 每个中断占4字节(CS:IP)
-
DOS功能调用:
- 使用INT 21H
- 常用功能:
- 01H:键盘输入
- 02H:显示输出
- 09H:显示字符串
- 4CH:程序结束
-
I/O指令:
- IN:从端口输入
- OUT:向端口输出
- 端口地址:0~FFFFH
十、典型程序结构
-
顺序结构:
- 指令顺序执行
-
分支结构:
CMP AL,BL JA LABEL1 ; AL>BL时转移 JB LABEL2 ; AL<BL时转移 JE LABEL3 ; AL=BL时转移
-
循环结构:
MOV CX,10 LOOP1:; 循环体LOOP LOOP1 ; CX=CX-1, CX≠0时循环
-
子程序结构:
; 调用 CALL SUB1; 定义 SUB1 PROC NEAR/FAR; 子程序体RET SUB1 ENDP
十一、数值处理
-
数制转换:
- BCD码调整指令:
- AAA/AAS:非压缩BCD加减调整
- AAM/AAD:非压缩BCD乘除调整
- DAA/DAS:压缩BCD加减调整
- BCD码调整指令:
-
符号扩展:
- CBW:AL符号扩展到AX
- CWD:AX符号扩展到DX:AX
-
算术运算注意事项:
- 乘法:8位×8位→16位,16位×16位→32位
- 除法:被除数位数是除数两倍
十二、调试与排错
-
DEBUG命令:
- R:查看/修改寄存器
- D:显示内存内容
- E:修改内存内容
- U:反汇编
- T/P:单步执行
- G:连续执行
- Q:退出
-
常见错误:
- 操作数类型不匹配
- 非法寻址方式
- 段寄存器使用不当
- 跳转超出范围
- 堆栈不平衡
创作不易,如果您都看到这里了,可以给我一个点赞、收藏并关注一下么?您的支持与喜爱是激励我创作的最大动力!
如果内容有误请及时联系我进行修改