第四章:汇编语言程序设计
§ 4.1 汇编语言程序设计基础
汇编语言程序设计的步骤:
- 分析问题:从实际问题中提取数学模型,明确任务要求及目的。
- 确定算法:找出解决问题的方法,确定出算法,并画出程序流程框图。
- 编写程序:根据程序流程框图及所用CPU的指令系统,采用汇编语言进行编程设计。
- 检验程序:对编写好的程序进行编译、连接,并进行调试,调试时要选取一组典型数据,查看程序是否可以达到预期的目标,如果程序有错误,则返回3步,修改程序,重新对程序进行检验,直至程序达到预期的目标。
- 编写软件说明:编写软件使用的功能、使用前提、应用用法等有关说明。
段定义伪指令
段名 SEGMENT
;实体
段名 ENDS
SEGMENT和ENDS左边的段名要一致
SEGMENT和ENDS要配对使用
段名一旦用SEGMENT定义了,段名本身就具有段地址属性(段名的偏移地址为0)
定位类型:告诉汇编程序本逻辑段起始地址的要求 定位类型总共四个 
一般情况下我们不去管定位类型
组合类型:多模块程序设计中,告诉链接程序不同程序中的同段名同组合类型的逻辑段如何链接
本课只学习单模块程序设计,我们只介绍两种,STACK型,告诉连接程序本段为堆栈段.并且系统会自动完成对SS和SP的初始化,NONE型:说明本逻辑段和任何模块中的任何逻辑段都没有关系
类别:类别必须要用单引号引起来,但是类别这个参数没有任何意义,指示告诉程序阅读员程序信息的种类
§ 4.2 8086汇编语言的完整结构
nasm
STACK SEGMENT STACK;用了STACK之后不用初始化SS和SP
DB 256 DUP(?);栈内存定义256字节
TOP LABEL WORD;这里用到了LABLE伪指令,这条指令的意思是TOP具有栈内存256个字节后下一个字节的偏移地址和段地址属性,但TOP并不占用该内存
STACK ENDS
DATA SEGMENT
;段内实体,用DW,DB等来定义
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK;段名是我们自己取的,CPU并不知道这些段是什么类型,所以要用ASSUME指令可以让段和我们定义的段来配对,配好对后,CPU承认了CODE段是CS段,DATA段是DS段,DATA段是ES段,STACK段是SS段,但是并没有把这些段的段地址放到相应的寄存器里,需要用户手动初始化
START:MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK;因为我们上面已经用STACK说明了,所以以下三条指令是可有可无的
MOV SS,AX
MOV SP,OFFSET TOP
;编写程序
MOV AX,4C00H
INT 21H;运行后用INT调用4C00H,也就是结束用户程序,返回DOS
CODE ENDS
END START;结束,需要在END右边写上起始地址告诉系统程序从START开始执行,这里写上标号其实就是系统自动给CS和IP初始化了§ 4.3 分支程序设计
分支结构分为单分支结构和多分支结构
在分支结构中都是有条件的,在使用条件时要先产生条件,一般是用运算来产生条件,最常用的是CMP和TEST指令 除了AF以外,其他所有的状态标志位都是条件
产生了条件之后,我们需要判断条件是否成立,用条件转移指令来实现,JZ,JNZ JS/JNS等等
条件转移指令的转移范围为-128~+128字节,如果超过了,就得用无条件转移指令JMP来搭桥
在实际调试的时候,一定要保证结果的正确性
分支语句设计要点:
- 正确选择分支条件和条件转移指令
- 保证每个分支的正确性
- 程序调试的时候要逐条分支去调试
§ 4.4 循环程序设计
循环程序的组成
- 初始化
- 循环工作
- 参数调整
- 循环判定
- 结果处理
§ 4.5 子程序设计技术
参考§3.11