5.7汇编程序设计举例
汇编源程序的设计步骤:
①分析问题,建立数学模型
②确定最佳算法
③合理分配存储单元和寄存器
④绘制流程图
⑤编写程序
⑥调试程序
5.7.1程序基本结构
程序设计的三种基本结构:顺序结构、选择结构、循环结构
- 顺序结构:顺序结构程序中,完全按照指令先后顺序逐条执行。
- 选择结构
选择结构又称分支结构,有以下两种形式:
①它们共同的特点是:运行方向是向前的,在某一种特定条件下,只能执行多个分支中的一个分支。
②程序的分支一般用条件转移指令来产生,利用转移指令不影响条件码的特性,连续地使用条件转移指令可以使程序产生多个不同的分支。或者使用跳跃表法,使程序能够根据不同的条件转移到多个程序分支中。
- 循环结构
循环结构又称重复结构,即反复执行某一部分的操作。有当型(WHILE型)循环结构和直到型(UNTIL型)循环结构两种,如图所示:
①循环程序可由三部分组成:循环初始状态设置、循环工作部分、循环修改部分;
控制循环的执行并判断是否结束循环的方法主要有3种:计数控制、条件控制、逻辑尺控制;
- 计数控制:是一种最常用的循环控制方法,适用于事先已知循环次数的情况。即可用循环指令LOOP实现,也可用条件转移指令实现。
- 条件控制:适用于事先不知道循环次数的情况,但可以用给定的某种条件来判断是否结束循环。
- 逻辑尺控制:一些情况下,循环体内的处理任务在每次循环执行时并无规律,但确实需要连续运行。此时,可以给各处理操作标以不同的特征位,所有特征位组合在一起就形成了一个逻辑尺。
注意:
5.7.3 分支结构程序设计
1. 分支程序的结构形式:单纯分支、 并行分支结构、选择分支结构
2. 跳跃表法
多分支结构的实现,还可以使用跳跃表法,使程序能根据不同的条 件转移到多个程序分支中去。 需要在数据段事先安排一个按顺序排列的转移地址表。输入的数字作为偏移量。因为只有2个字节16位偏移地址,所以偏移量需要乘2。关键是要理解间接寻址方式JMP指令。
5.7.4 循环结构程序设计
1. 循环程序由五个部分组成: 循环初始化部分,循环体,循环修改部分,循环控制部分,结束处理部分。
循环程序结构:计数循环、当循环、直到循环
2. 循环控制方法
(1)计数控制(循环次数已知时,常用)
① 倒计数
将循环次数n ,送入一循环计数器中, 每循环一次,计数器减1,直到其值为0。
② 正计数
循环次数n。0送入一循环计数器中, 每循环一次,计数器加1,直到其值为n。
⑵条件控制
循环次数未知。但是循环结束与某些条件(比较、运算的结果等等)相关,比较所要求的条件是否达到,未满足继续循环,否则结束循环。在解决实际问题时,往往要根据问题给定的已知条件,在认真分析算法之后才能确定选用哪种方法。
⑶逻辑尺控制
循环体内的处理任务在每次循环执行时并无规律,但确实需要连续运行。此时,可以给各处理操作标以不同的特征位,所有特征位组合在一起,就形成了一个逻辑尺。
5.7.5子程序设计
子程序是具有一定的功能,能被多次调用的程序。
- 子程序定义与调用
子程序定义由过程定义伪指令PROC/ENDP实现,格式为:
- 子程序的调用和返回
子程序的调用和返回由CALL指令和RET指令实现。可分类如下:
- 段内调用和段间调用
a.段内调用:在子程序和调用返回过程中,转移地址和返回地址不涉及CS的变化,只通过IP内容的变化实现程序的转移和返回。
b.段间调用:由CS和IP的变化共同决定程序的转移和返回。
当子程序与主程序在同一代码段时,可把子程序定义为NEAR属性或FAR属性;当不在同一代码段时,必须将子程序定义为FAR属性。
- 直接调用和间接调用
a.直接调用:调用指令使用过程名调用某过程时,调用时通过把该过程的指令入口送入CS和IP(段内调用仅修改IP)。
b.间接调用:调用指令是通过某个寄存器或存储器单元指出被调用子程序的入口地址。(可分为寄存器间接调用和存储器间接调用)
断点的保护和返回时通过堆栈指令PUSH和POP来实现的。
- 编写子程序时的注意事项
- 子程序的结构
子程序通常由子程序说明部分与代码部分所组成。
说明部分由下列几部分所组成:子程序名称,子程序功能,入口参数,出口参数,使用的寄存器和存储单元,调用的其它子程序,
代码部分:保护现场;根据入口参数,获取要处理的数据;进行数据处理;根据出口参数,将处理后的数据送至指定的区域;恢复现场;返回主程序
- 主程序与子程序的参数传递的方法
主程序为子程序提供入口参数,子程序根据入口参数进行一系列处理,程序返回结果给主程序,主程序和子程序间的参数传递有三种方法:
- 用寄存器和存储器传递参数:如果子程序和主程序在同一个模块内,那么在主程序数据段中所定义的变量,子程序可以直接使用;
- 用地址表传递参数:在转向子程序前,将参数的地址放入一个表中,将表的首地址作为入口参数传递给子程序,由子程序根据参数表中的地址取出相应的参数;
- 用堆栈传递参数:转向子程序前,将子程序所用参数压入堆栈,进入子程序,由子程序从堆栈中取出所用的参数。
- 子程序的嵌套和递归调用
子程序的嵌套:在一个子程序中又调用其他的子程序。(只要堆栈允许,嵌套的层次就可以不加限制)
子程序的递归调用:指在子程序嵌套调用时,调用的子程序就是它本身。
附录 俄罗斯方块设想