Skip to content

第四章:汇编语言程序设计 ​

§ 4.1 汇编语言程序设计基础 ​

汇编语言程序设计的步骤:

  1. 分析问题:从实际问题中提取数学模型,明确任务要求及目的。
  2. 确定算法:找出解决问题的方法,确定出算法,并画出程序流程框图。
  3. 编写程序:根据程序流程框图及所用CPU的指令系统,采用汇编语言进行编程设计。
  4. 检验程序:对编写好的程序进行编译、连接,并进行调试,调试时要选取一组典型数据,查看程序是否可以达到预期的目标,如果程序有错误,则返回3步,修改程序,重新对程序进行检验,直至程序达到预期的目标。
  5. 编写软件说明:编写软件使用的功能、使用前提、应用用法等有关说明。

段定义伪指令

段名 SEGMENT

;实体

段名 ENDS

SEGMENT和ENDS左边的段名要一致

SEGMENT和ENDS要配对使用

段名一旦用SEGMENT定义了,段名本身就具有段地址属性(段名的偏移地址为0)

定位类型:告诉汇编程序本逻辑段起始地址的要求 定位类型总共四个 image-20210315163722561

一般情况下我们不去管定位类型

组合类型:多模块程序设计中,告诉链接程序不同程序中的同段名同组合类型的逻辑段如何链接

本课只学习单模块程序设计,我们只介绍两种,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

以笔记为镜,可以知得失