1 / 15

第六章 子程序结构

第六章 子程序结构. 子程序的设计方法 (P212) 嵌套与递归子程序 (P233) 子程序举例 (P241). 子程序的设计方法 (P212). 过程的定义伪操作: 过程名 proc 属性 { 过程内容 } 过程名 endp 过程名为标识符,子程序入口的符号地址。 属性: 类型属性 NEAR ,FAR 属性定义的原则: 1 ) 调用程序和过程在同一个代码段中则使用 NEAR 2 ) 调用程序和过程不在同一个代码段中则使用 FAR. 调用程序和子程序的位置.

eloise
Télécharger la présentation

第六章 子程序结构

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第六章 子程序结构 • 子程序的设计方法(P212) • 嵌套与递归子程序(P233) • 子程序举例(P241)

  2. 子程序的设计方法(P212) 过程的定义伪操作: 过程名 proc 属性 {过程内容} 过程名 endp 过程名为标识符,子程序入口的符号地址。 属性: 类型属性 NEAR ,FAR 属性定义的原则: 1) 调用程序和过程在同一个代码段中则使用NEAR 2) 调用程序和过程不在同一个代码段中则使用FAR

  3. 调用程序和子程序的位置 调用程序和子程序在相同的代码段中: 1、非嵌套 Main proc far … call subr1 Ret Main endp Subr1 proc near … Ret Subr1 endp 2、嵌套 Main proc far … call subr1 Ret Subr1 proc near … Ret Subr1 endp Main endp

  4. 调用程序和子程序的位置 调用程序和子程序在不同的代码段中: Segx segment … Subt proc far … Ret Segx endp … Call subt … Segx ends Segy segment … Call subt … Segy ends

  5. 子程序的调用和返回(P214) 为了正确调用及返回需要注意的问题: 1、子程序的属性的定义。 2、子程序运行期间堆栈的状态。 3、子程序返回时的堆栈的状态。

  6. 保存和恢复寄存器 由于调用程序和子程序经常是分别编制的,所以寄存器 的使用往往会发生冲突。 例如: 如果主程序在调用子程序以前的某个寄存器内容在从子程序返 回后还有用,而子程序又恰恰使用了同一个寄存器,因此破坏 了该寄存器的原有的内容。 解决方法: 把子程序使用的寄存器保存到堆栈中,返回时再从堆栈中恢复。 Subt proc near push ax pop dx push bx pop cx push cx pop bx push dx pop ax ….. ret Subt endp

  7. 保存与恢复要注意的问题 1、用于传递参数的寄存器可以不用保存。 2、需要作为返回参数的寄存器不可以保存和恢复。 3、主程序中在调用子程序后内容仍然需要使用的 寄存器必须保存。

  8. 子程序的参数传递(P215) 1、通过寄存器传递变量 问题举例:L63.ASM(P215) 十进制到十六进制的转换程序。要求从键盘得到一个十进 制的数,然后把该数转换为十六进制的形式并在屏幕上显示出 来。 2、通过数据段传递变量(过程和调用程序在同一源文件中) L641.asm (P218) 3、通过地址表传递变量 L642.asm (P219) 4、通过堆栈传递变量 L643.asm (P221)

  9. 结构的定义(P223) 格式: 结构名 STRUC …….. (DB,DW,DD等的伪操作序列) 结构名 ENDS 例子: Personal_data struc initials db ‘XX’ last_name db 5 dup(?) id db 0,0 age db ? weight dw ? Personal_data ends 作用: 定义一种结构模式,并不分配存储单元。

  10. 结构预置语句 作用: 为定义的结构分配存储器空间 格式: 变量名 结构名 <预赋值说明> 例子: EMPLOYEE_1 Personal_data <‘JR’,,,35> EMPLOYEE_2 Personal_data <> EMPLOYEES Personal_data 100 dup(<>)

  11. 结构变量的访问 格式: 数据结构的首地址.字段名 例如: MOV SI,2 MOV AL,EMPLOYEE_1.LAST_NAME[SI] MOV AL,[BX].AGE MOV AL,EMPLOYEES+4*12.LAST-NAME[SI]

  12. 嵌套与递归子程序 1、子程序的嵌套 2、子程序的递归调用

  13. 子程序的嵌套 子程序A (proc_a) …… Call proc_b ….. ret 子程序B Proc_b …. ret 主程序 Call proc_a

  14. 递归子程序 子程序A Proc_a ….. Call Proc_a ….. ret 例子:P234例6.8 编制计算N!(N>=0)的程序。 N!=N*(N-1)*(N-2)*…*1 递归定义: 0! = 1 N!=N*(N-1)! (N>0) 注意:递归子程序要把每次调用的参数,寄存器的内容及所有中间结果都存放在堆栈中;递归子程序还必须包括基数的设置,当调用参数达到基数时,还必须有一条条件转移指令实现嵌套退出,以保证能按反序退出并返回主程序。

  15. 子程序举例 • P241 6.9 • P244 6.10

More Related