汇编语言教学课件8.ppt
文本预览下载声明
第八章 子程序设计 8.1 子程序的引出 8.2 子程序(过程)定义伪指令 8.3 调用和返回指令 8.4 子程序设计方法 8.4.1 现场的保护和恢复 8.4.2 子程序说明文件 8.4.3 主程序与子程序之间的参数传递 8.5 子程序嵌套 8.6 递归子程序 8.8 程序的连接 8.1 子程序的引出 在我们编写解决实际问题的程序时,往往会遇到多处使用相同功能的程序段, 使用该程序段的唯一差别是对程序变量赋不同的值,例如计算: S=√2X+√3Y+√150 计算上述函数需要多次使用开方运算,如果每次用到开方运算就编写一段开方程序,那么开方程序在程序中会多次出现,不仅书写麻烦,容易出错,编辑、汇编它时,也会花费较多时间。同时,由于冗长,占用内存也较多。如果把多次使用的功能程序编制为一个独立的程序段,每当用到这种功能时,就将控制转向它,完成功能后再返回到原来的程序,这就会大大减少编程工作量。 8.1 子程序的引出 8.1 子程序的引出 8.2 子程序(过程)定义伪指令 子程序定义伪指令所定义的子程序的一般格式: PN PROC[NEAR]/[FAR] ;说明过程开始 : ;过程体 : PN ENDP ;说明过程结束 8.3 调用和返回指令 1.调用分类 (1)段内调用与段间调用(p127) (2)直接调用与间接调用(p127) 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) 受影响的寄存器:没有 调用指令举例 1、段内调用: a. 段内直接调用 CALL PROC_N b. 段内寄存器间接调用 CALL SI c. 段内存储器间接调用 CALL MEM_W CALL WORD PTR[BX] CALL WORD PTR[SI+DISP] CALL WORD PTR[BX+DISP] CALL WORD PTR[BX+SI+DISP] 调用指令举例 2、段间调用: a. 段间直接调用 CALL FAR PTR PROC_N c. 段间存储器间接调用 CALL DWORD PTR MEM_D CALL DWORD PTR[BX] CALL DWORD PTR[SI+DISP] CALL DWORD PTR[BX+DISP] CALL DWORD PTR[BX+SI+DISP] 调用的类型与过程定义的类型必须一致; 由于在转返过程中要使用堆栈保存断点,以备返回,因此在程序设计中必须要有堆栈段。同时注意主程序、子程序应使用统一堆栈,否则转返过程不易控制。堆栈最好放在主程序中,其大小应由嵌套层次、传递参数等因素决定。 3.返回指令 指令汇编格式:RET [VAL]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子程序设计方法 8.4.1 现场的保护和恢复 8.4.2 子程序说明文件 8.4.3 主程序与子程序之间的参数传递 8.4.1 现场的保护
显示全部