汇编语言第八章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MOV DX,PX ;取X 2.约定存储单元法 ADD DX,DX ;计算2X MOV ARGX,DX CALL SQROOT2 ;调用开平方子程序 MOV DX,ROOT SQROOT2 PROC NEAR PUSH DX ;暂存结果√2X MOV DX,ARGX MOV DX,PY ;取Y XOR AX,AX MOV AX,DX ;计算3Y AND DX,DX ADD DX,DX JZ SQRT2 ADD DX,AX SQRT1: MOV BX,AX MOV ARGX,DX SHL BX,1 CALL SQROOT2 ;调用开平方子程序 INC BX POP AX ;取出√2X SUB DX,BX ADD AX,ROOT ;计算√2X+√3Y JC SQRT2 PUSH AX ;暂存结果 INC AX MOV ARGX,150 JMP SQRT1 CALL SQROOT2 SQRT2: MOV ROOT,AX POP AX ;取出中间结果 RET ADD AX,ROOT ;计算最终结果 SQROOT2 ENDP MOV RLT,AX ;保存结果 MOV AH,4CH INT 21H CSEG ENDS END MAIN2
8.4.2子程序说明文件
子程序说明文件例子: (1)子程序名:SQROOT1; (2)程序功能:求双字节整数的平方根的整 数部分; (3)入口条件:被开方数放在DX中; (4)出口条件:平方根在DX中; (5)受影响的寄存器:AX,BX,CX,DX及标志寄 存器F。
8.4.3 主程序与子程序之间的参数传递
;子程序正常工作 ;恢复现场
SQROOΒιβλιοθήκη Baidu1
(2) 利用内存单元。用传送指令将寄存器的内容保存到指 定的内存单元,恢复时再用传送指令取出。
8.4.2子程序说明文件
(1)子程序名(子程序入口地址):用过程(子程序)定义伪 指令定义该过程(子程序)时的过程名,这时过程(子程序) 中第一条语句必须是子程序的入口指令;否则应写子程序入 口指令的标号或地址。 (2)子程序功能:用自然语言或数学语言等形式简单清楚地描 述子程序完成的任务。 (3)入口条件:说明子程序要求有几个入口参数,这些参数表 示的意义及存放位置。 (4)出口条件:说明子程序有几个输出参数(运行结果),这 些参数表示的意义、存放的位置。 (5)受影响的寄存器:说明子程序运行后,哪些寄存器的内容 被破坏了,以便使用者在调用该子程序之前注意保护现场。
3.返回指令
指令汇编格式:RET [VAL] 操作:(1) 段内返回: IP←(SP+1,SP) SP←SP+2 SP←SP+VAL(如果选用了VAL) (2) 段间返回: IP←(SP+1,SP) SP←SP+2 CS←(SP+1,SP) SP←SP+2 SP←SP+VAL(如果选用了VAL) 受影响的寄存器:没有
8.4.1 现场的保护和恢复
保护现场和恢复现场的方法: (1) 利用压栈和出栈指令,将寄存器内容或状态标志位内 容保存在堆栈中,恢复时再从堆栈中取出。 例子:
SQROOT1 PROC NEAR PUSH AX PUSH BX PUSH CX ... POP CX POP BX POP AX RET ENDP ;保存现场
18: MOV 19: ADD 20: CALL 21: PUSH 22: MOV 23: MOV 24: ADD 25: ADD 26: CALL 27: POP 28: ADD 29: PUSH 30: MOV 31: CALL 32: POP 33: ADD 34: MOV 35: MOV 36: INT 37:CSEG 38: END
8.1 子程序的引出
子程序设计需了解的问题: 1.子程序的定义与调用 设计出可以完成相对独立功能的程序 段,并对汇编程序提供必要的信息,使得 对该程序段汇编之后,在需要时可以被其 他主程序调用,这一过程称为子程序的定 义。 已定义的子程序在什么时候被执行, 执行多少次,都不是由子程序自身决定的 。在主程序需要调用相应的子程序时,可 以用调用子程序指令使得相应子程序被执 行。 2.主程序与子程序之间的调用与返回 在主程序需要利用子程序的执行来完 成某种工作时,就可以使用调用子程序指 令来调用相应的子程序;在子程序完成它 应该完成的工作之后,应当用返回指令返 回调用它的主程序。
第八章
8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8
子程序设计
子程序的引出 子程序(过程)定义伪指令 调用和返回指令 子程序设计方法 子程序嵌套 递归子程序 可重入子程序 程序的连接
8.1 子程序的引出
在我们编写解决实际问题的程序时,往往会遇 到多处使用相同功能的程序段, 使用该程序段的唯 一差别是对程序变量赋不同的值,例如计算: S=√2X+√3Y+√150 计算上述函数需要多次使用开方运算,如果每 次用到开方运算就编写一段开方程序,那末开方程 序在程序中会多次出现,不仅书写麻烦,容易出错, 编辑、汇编它时,也会花费较多时间。同时,由于 冗长,占用内存也较多。如果把多次使用的功能程 序编制为一个独立的程序段,每当用到这种功能时, 就将控制转向它,完成功能后再返回到原来 的程序,这就会大大减少编程工作量。
主程序
子程序SUBR
:
: CALL SUBR : :
:
: : : :
RET
8.1 子程序的引出
3.主程序与子程序之间的信息转换 主程序调用子程序前,应当向子程 序提供必要的加工对象,子程序执行结 束返回主程序时,应向主程序传递加工 结果。 4.保护现场与恢复现场 主程序和子程序在工作时都需要使 用寄存器,在主子程序之间来回交替工 作时就会发生寄存器冲突。
主程序 : : CALL SUBR : :
子程序SUBR : : : :
:
RET
8.2 子程序(过程)定义伪指令
子程序定义伪指令所定义的子程序的一般格式: PN PROC[NEAR]/[FAR] ;说明过程开始 : ;过程体 : PN ENDP ;说明过程结束
8.3 调用和返回指令
1.调用分类 (1)段内调用与段间调用 (2)直接调用与间接调用
子程序运行时所需的加工对象应由调用程序提供,处理 的结果应提供调用程序使用,二者之间要进行信息交换或者 说相互之间要传递参数。 常用的传送方法有四种: (1)约定寄存器法; (2)约定存储单元法; (3)堆栈法; (4)约定参数地址指针法。 以计算下述函数为例,说明各种参数传送方法。 例8.1 编制程序计算:Z=√2X+√3Y+√150 设X,Y 为整数字数据,且存于PX和PY单元,计算结果存入 RLT单元。
1.约定寄存器法
开平方子程序和调用程序,约定将被开平方数放在DX中, 平方根也放在DX中,其结果求得平方根的整数部分。
1:;*****EXAM8.1.1S***** 2:SQROOT1 PROC NEAR 3: XOR AX,AX 4: AND DX,DX 5: JZ SQRT2 6:SQRT1: MOV BX,AX 7: SHL BX,1 8: INC BX 9: SUB DX,BX 10: JC SQRT2 11: INC AX 12: JMP SQRT1 13:SQRT2: MOV DX,AX 14: RET 15:SQROOT1 ENDP
1.约定寄存器法
约定寄存器法传送参数,即事先约定一 些存放参数的通用寄存器,调用程序转向子 程序时,先把要传送的参数放到约定好的寄 存器中,子程序工作时,从约定的寄存器中 取参数,然后把结果存入事先约定的寄存器 中,调用程序再从约定的寄存器中取结果。 这种方法是程序设计中最常用、最简单、最 方便的方法,在传送参数不多的情况下都采 用此方法。
DX,PX ;取X DX,DX ;计算2X SQROOT1 ;调用开平方子程序 DX ;暂存结果√2X DX,PY ;取Y SQROOT1 AX,DX ;计算3Y XOR DX,DX AND DX,AX JZ SQROOT1 ;调用开平方子程序SQRT1: MOV AX ;取出√2X SHL AX,DX ;计算√2X+√3Y INC AX ;暂存结果 SUB DX,150 JC SQROOT1 INC AX ;取出中间结果 JMP AX,DX ;计算最终结果 SQRT2: MOV RLT,AX ;保存结果 RET AH,4CH SQROOT1 21H ENDS MAIN1
8.4 子程序设计方法
8.4.1 现场的保护和恢复 8.4.2 子程序说明文件 8.4.3 主程序与子程序之间的参数传递
8.4.1 现场的保护和恢复
子程序中需要使用的寄存器,有可能在主程序中正被用来 保存某种中间结果,这些寄存器的值在从子程序返回主程序后 还要继续使用, 这些寄存器的值或所需的标志位的值等信息称 之为现场。显然,子程序执行前需要保护现场,返回时要恢复 现场。 保存现场与恢复现场的工作既可在调用程序中完成,也可 在子程序中完成,程序设计时根据情况安排。如果子程序已经 设计好了,而其中未保护主程序现场,那么调用程序在使用子 程序之前应保护现场,从子程序返回后再恢复现场。 通常在主程序中保护现场,则一定在主程序中恢复;在子 程序中保护现场,则一定在子程序中恢复。这样可以增强主程 序和子程序之间的相对独立性,减少相互依赖,使程序结构清 楚,减少错误。
8.1 子程序的引出
使用子程序的好处: (1)简化了程序设计过程,减少了工作量,节 省了时间; (2)源程序缩短,节省了机器汇编源程序的时 间和存储目标代码的存储空间; (3)增加了源程序的可读性,便于调试维护; (4)有利于程序模块化、结构化和自顶向下的 程序设计; (5)子程序一旦编制成功,在开发研制各种软 件时都可利用,大大缩短了软件的开发周期。
;i←0 ;测试被开方数 ;被开方数为0 ;形成奇数
;被开方数减去奇数 ;不够减 ;够减,i增1 ;继续 ;DX←平方根 ;返回
1.约定寄存器法
调用程序:
1:;*****EXAM 8.1.1M***** 2:SSEGSEGMENT STACK 3:STKTOP DB 20 DUP(0) 4:SSEG ENDS 5:DSEG SEGMENT 6:PX DW 12345 7:PY DW 2469 8:RLT DW 0 9:DSEG ENDS 10:CSEG SEGMENT 11: ASSUME CS:CSEG,DS:DSEG 12: ASSUME SS:SSEG 13:MAIN1: MOV AX,DSEG 14: MOV DS,AX 15: MOV AX,SSEG 16: MOV SS,AX 17: MOV SP,SIZE STKTOP
2.调用指令
指令汇编格式:CALL PROCNAME/REGNAME/MEMLABEL 操作:(1)段内调用: SP←SP-2 (SP+1,SP)←IP IP←OFFSET PROCNAME或REGNAME或(MEMLABEL) (2)段间调用: SP←SP-2 (SP+1,SP)←CS CS←SEG PROCNAME或(MEMLABEL+2,MEMLABEL+3) SP←SP-2 (SP+1,SP)←IP IP←OFFSET PROCNAME或(MEMLABEL,MEMLABEL+1) 受影响的寄存器:没有
PROC AX,AX DX,DX SQRT2 BX,AX BX,1 BX DX,BX SQRT2 AX SQRT1 DX,AX ENDP
2.约定存储单元法
3.堆栈法 4.约定参数地址指针法
2.约定存储单元法例子
约定被开方数放在ARGX单元,计算结果放在ROOT单元
SSEG SEGMENT STACK STKTOP DB 20 DUP(0) SSEG ENDS DSEG SEGMENT PX DW 12345 PY DW 2469 RLT DW 0 ARGX DW 0 ROOT DW 0 DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG,SS:SSEG MAIN2: MOV AX,DSEG MOV DS,AX MOV AX,SSEG MOV SS,AX MOV SP,SIZE STKTOP