汇编语言程序的设计-分支结构
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.多分支程序设计
5.2 分支程序设计
多个条件对应各自的分支语句体,哪个条件成立 就转入相应分支体执行。多分支可以化解为双分 支或单分支结构的组合,例如:
Y Xor ah,ah ;等效于cmp ah,0 AH=0 jz function0 ;ah=0,转向function0 N dec ah ;等效于cmp ah,1 Y AH=1 jz function1 ;ah=1,转向function1 N dec ah ;等效于cmp ah,2 Y jz function2 ;ah=2,转向function2 AH=2 N
5.2 分支程序设计
MOV AL,NUM MOV DL,’?’ CMP AL,0 JZ DISP MOV BX,0;BX用来记录位1的位数 AGAIN:SHR AL,1 JC NEXT INC BX JMP AGAIN NEXT:SHL BX,1 JMP ADTAB[BX] AD0:MOV DL,’0’ JMP DISP AD1:MOV DL,’1’ JMP DISP
6.1 子程序的设计方法
2. 子程序的调用与返回
子程序调用:隐含使用堆栈保存返回地址
call near ptr subp
(1) 保存返回地址 (2) 转子程序
(SP)→
(IP)
call far ptr subp
(1) 保存返回地址 (2) 转子程序
(SP)→
(IP) (CS)
子程序返回:ret
3.保存与恢复寄存器 一般通过堆栈来实现, 主要在子程序中进行, 例如,子程序subt中 用到了寄存器ax,bx, cx和dx,则可能的保 存与恢复寄存器如左:
过程名(子程序名)为符合语法的标识符
NEAR属性(段内近调用)的过程只能被相同代码段的 其他程序调用,主程序和子程序在同一代码段 FAR属性(段间远调用)的过程可以被相同或不同代码 段的程序调用,主程序和子程序不在同一代码段
code segment
main proc …… call …… ret endp far subr1
5.2 分支程序设计
AD2:MOV DL,’2’;第2位为1, JMP DISP AD3:MOV DL,’3’ JMP DISP AD4:MOV DL,’4’ JMP DISP AD5:MOV DL,’5’ JMP DISP AD6:MOV DL,’6’ JMP DISP AD7:MOV DL,’7’ DISP:MOV AH,2;显示 INT 21H MOV AH,4CH ;返回DOS INT 21H CODE ENDS END START
6.1 子程序的设计方法 子程序调用方法说明
一个子程序可以供多个用户编写的主程序调用。在不了解 子程序内部算法的前提下能够很好地使用子程序也是子程 序应具备的特性。 一个完整的子程序,应包括子程序调用方法说明。主要包 括以下6个方面内容。 (1)子程序名:供调用子程序时使用 (2)子程序功能:供选择子程序时参考 (3)占用寄存器:说明子程序执行时,要使用哪些寄存器; 子程序执行完后,哪些寄存器的内容被改变,哪些寄存器 的内容保持不变。 (4)入口参数:说明子程序执行应具备的条件。 (5)输出参数:说明子程序执行后的结果存放在何处。 (6)子程序调用示例:说明子程序的调用格式。
segx
subt
segment
proc …… ret endp …… subt …… far
subt call
main
segx
subr1 proc …… ret subr1 endp near
ends segment
…… far ptr subt ……
segy
call
code ends
segy
ends
6.1 子程序的设计方法
ຫໍສະໝຸດ Baidu
function0
function1 function2
地址表形成多分支
5.2 分支程序设计
利用地址表法实现多分支程序设计的一般方法为: 把各分支程序段的入口地址(一般是偏移地址,也 可以使段地址与偏移地址)依次存放在数据段的一 个表中,形成地址表。取各分支程序段的编号作为 给分支入口地址的表地址的位移量。 某个分支程序入口地址的表地址为: 表地址=编号*2+入口地址首地址。 根据条件首先在地址表中找到转移的目标地址,然 后转到相应位置,从而实现多分支。
6.1 子程序的设计方法
subt proc push push push push …… pop dx pop pop pop far ax bx cx dx
cx bx ax ret subt endp
4.子程序的参数传送
6.1 子程序的设计方法
入口参数(输入参数): 主程序提供给子程序 出口参数(输出参数): 子程序返回给主程序 参数的形式:
例:用地址表法编写程序实现从低到高逐位检测 一个字节数据,找到第一个非0的位数。检测时, 为0,则继续检测;为1,则转移到对应的处理程 序段显示相应的位数。
DATA SEGMENT NUM DB 78H ADTAB DW AD0,AD1,AD2,AD3,AD4,AD5,AD6,AD7;地址 表 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX
① 数据本身(传值) ② 数据的地址(传址)
传递的方法:
① 寄存器 ② 变量 ③ 堆栈
(1)通过寄存器传送参数 最常用的一种方式,但能传递的参数有限, 适合于参数较少的情况。 需要注意:用于传递出口参数的寄存器不 能进行现场保护和恢复。
6.1 子程序的设计方法
6.1 子程序的设计方法
6.1 子程序的设计方法
程舒慧
2011.9.19
汇编语言
程舒慧
2011.11.15
5.2 分支程序设计
分支结构是对问题的处理方法有两种以上 不同选择时采用的程序设计方法,在程序 中,根据某一判断的不同结果执行不同的 程序段。 根据执行的程序段数量的多少不同,可分 为双分支结构程序和多分支结构程序。 每一次对条件的判断都会产生两种可能的 结果:真(条件满足)或假(条件不满 足)。
1.双分支结构 典型的双分支结构程序的流程图:
条件成立跳转执行第2个分 支语句体,否则顺序执行第 1个分支语句体。注意第1 个分支体后一定要有一个 JMP指令跳到第2个分支体 后
5.2 分支程序设计
5.2 分支程序设计
条件成立跳转,否则顺 序执行分支语句体; 注意选择正确的条件 转移指令和转移目标 地址
第6章 子程序结构
把功能相对独立的程序段单独编写和调试, 作为一个相对独立的模块供程序使用,就 形成子程序 子程序可以实现源程序的模块化,可简化 源程序结构,可以提高编程效率
6.1 子程序的设计方法 1.过程定义伪操作
过程名 过程名
6.1 子程序的设计方法
PROC [NEAR|FAR] ... ENDP