版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第六章 子程序结构6.1 子程序的设计方法 过程(子程序)定义伪操作procedure_name PROC NEAR ( FAR ) procedure_name ENDP(1)NEAR属性:调用程序和子程序在同一代码段中 (段内调用)(2)FAR属性:调用程序和子程序不在同一代码段中 (段间调用)2code segment main proc far call subr1 retmain endpsubr1 proc near retsubr1 endpcode endscode segment main proc far call subr1 retsubr1 proc near ret
2、subr1 endpmain endpcode ends例6.1 调用程序和子程序在同一代码段中3例6.2 调用程序和子程序不在同一代码段中 segx segment subt proc far ret subt endp call subt segx ends segy segment call subt segy ends4保存与恢复寄存器subt proc far push ax push bx push cx push dx pop dx pop cx pop bx pop ax retsubt endp5 子程序调用(中断调用):隐含使用堆栈保存返回地址call near ptr s
3、ubp (1) 保存返回地址 (2) 转子程序 (IP) subp的偏移地址call far ptr subp (1) 保存返回地址 (2) 转子程序 (CS) subp的段地址 (IP) subp的偏移地址 (IP)(SP) (IP)(SP) (CS)子程序的调用和返回6(IP)(SP) (CS)(PSW)int n (n : 中断类型号) (1) 保存现场和返回地址 (2) 转中断处理程序 (IP) (n*4) (CS) (n*4+2)子程序返回(中断返回): (1)ret (2)iretint 21H7子程序的变量传送 (1)通过寄存器传送变量 (2)通过存储器传送变量 *子程序和调用程
4、序在同一程序模块中,则子程序可 直接访问模块中的变量。 *子程序和调用程序不在同一程序模块中,则有两种 传送方式:建立公共数据区和使用外部符号。 (3)通过地址表传送变量地址 (4)通过堆栈传送变量或变量地址8例6.3 十进制到十六进制的转换程序(通过寄存器传送变量)decihex segment ; 1016 assume cs: decihexmain proc far push ds sub ax, ax push axrepeat: call decibin ; 102 call crlf call binihex ; 216 call crlf jmp repeat retmain
5、endp9decibin proc near ; 102 mov bx, 0newchar: mov ah, 1 int 21h sub al, 30h jl exit ; 9退出 cbw xchg ax, bx mov cx, 10d mul cx xchg ax, bx add bx, ax jmp newcharexit: retdecibin endp10binihex proc near ; 216 mov ch, 4rotate: mov cl, 4 rol bx, cl mov al, bl and al, 0fh add al, 30h cmp al, 3ah jl print
6、it add al, 7h ; AF printit: mov dl, al mov ah, 2 int 21h dec ch jnz rotate retbinihex endp11crlf proc near mov dl, 0dh mov ah, 2 int 21h mov dl, 0ah mov ah, 2 int 21h retcrlf endpdecihex ends end main12例6.4 累加数组中的元素(直接访问变量)data segment ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw ?data endscode se
7、gmentmain proc far assume cs:code, ds:datastart: push ds sub ax, ax push ax mov ax, data mov ds, ax call near ptr proadd retmain endp13proadd proc near push ax push cx push si lea si, ary mov cx, count xor ax, axnext: add ax, si add si, 2 loop next mov sum, ax pop si pop cx pop ax retproadd endpcode
8、 ends end start14data segmentary dw 1,2,3,4,5,6,7,8,9,10count dw 10sum dw ?ary1 dw 10,20,30,40,50,60,70,80,90,100count1 dw 10sum1 dw ?data ends如果数据段定义如下:*如果直接访问内存变量,那么累加数组ary和数组ary1中的元素不能用同一个子程序proadd15例6.4 累加数组中的元素(通过地址表传送变量地址)data segment ary dw 10,20,30,40,50,60,70,80,90,100 count dw 10 sum dw ?
9、table dw 3 dup (?) ; 地址表data ends code segmentmain proc far assume cs:code, ds:datastart: push ds sub ax, ax push ax mov ax, data mov ds, ax mov table, offset ary mov table+2, offset count mov table+4, offset sum mov bx, offset table call proadd ret main endp 16proadd proc near push ax push cx push
10、si push di mov si, bx mov di, bx+2 mov cx, di mov di, bx+4 xor ax, axnext: add ax, si add si, 2 loop next mov di, ax pop di pop si pop cx pop ax retproadd endpcode ends end start ary 10 0000 20 0002 30 40 50 60 70 80 90 100 count 10 0014 sum ? 0016 table 0000 0018 (bx)00140016(si)(di)17例6.4 累加数组中的元素
11、(通过堆栈传送变量地址)data segment ary dw 10,20,30,40,50,60,70,80,90,100 count dw 10 sum dw ?data endsstack segment dw 100 dup (?) tos label wordstack ends 18code1 segmentmain proc far assume cs:code1, ds:data, ss:stackstart: mov ax, stack mov ss, ax mov sp, offset tos push ds sub ax, ax push ax mov ax, data
12、mov ds, ax mov bx, offset ary push bx mov bx, offset count push bx mov bx, offset sum push bx call far ptr proadd retmain endpcode1 ends19code2 segment assume cs: code2proadd proc far push bp mov bp, sp push ax push cx push si push di mov si, bp+0ah mov di, bp+8 mov cx, di mov di, bp+6 (bp)+0a 0000
13、(sp) (di) (si) (cx) (ax) (bp) (bp) (ip) (cs) (bp)+6 0016 (bp)+8 0014 0 (ds) xor ax, axnext: add ax, si add si, 2 loop next mov di, ax pop di pop si pop cx pop ax pop bp ret 6proadd endpcode2 ends end start2021结构预置语句:把结构中各字段的数据存入存储器, 并可重新输入字符串和数值。格式: 变量名 结构名 变量名 结构名 例: S991000 STUDENT_DATA S991001 ST
14、UDENT_DATA STUDENT STUDENT_DATA 100 DUP () 访问结构数据变量: MOV AL, S991000.NAMESI MOV AL, BX.NAMESI MOV AL, STUDENT+4*18.NAMESI22例6.4 累加数组中的元素(通过堆栈传送变量地址)stack_strc struc save_bp dw ? save_cs_ip dw 2 dup (?) par3_addr dw ? par2_addr dw ? par1_addr dw ?stack_strc ends23proadd proc far push bp mov bp, sp pu
15、sh ax push cx push si push di mov si, bp.par1_addr mov di, bp.par2_addr mov cx, di mov di, bp.par3_addr xor ax, axnext: add ax, si add si, 2 loop next mov di, ax pop di pop si pop cx pop ax pop bp ret 6proadd endp 0000 par1_addr (sp) (di) (si) (cx) (ax) (bp) (bp) (ip) (cs) 0016 par3_addr 0014 par2_a
16、ddr 0 (ds)246.2 嵌套与递归子程序子程序的嵌套主程序 子程序A 子程序B proc_A proc_B. . call proc_A call proc_B . ret ret递归子程序:n!25例6.7 计算n!frame struc save_bp dw ? save_cs_ip dw 2 dup (?) n dw ? result_addr dw ?frame endsdata segment n_v dw 3 result dw ?data endsstack segment dw 128 dup (0) tos label wordstack ends26272829例:
17、将字符串反序输出 mov bx, offset str push bx call revers pop bx mov dl, bx mov ah, 2 int 21hrevers proc near push ax push bx push dx push bp mov bp, sp mov bx, bp+10 mov al, bx cmp al, $ jne re_call jmp returnre_call: inc bx push bx call revers pop bx mov dl, bx mov ah, 2 int 21hreturn: pop bp pop dx pop bx
18、pop ax retrevers endp306.3 子程序举例例6.8 十六进制到十进制的转换程序(通过寄存器传送变量)hexidec segment ; 1610 main proc far assume cs: hexidecstart: push ds sub ax, ax push axrepeat: call hexibin ; 162 call crlf call binidec ; 210 call crlf jmp repeat retmain endp31hexibin proc near ; 162 mov bx, 0newchar: mov ah, 1 int 21h
19、sub al, 30h jl exit cmp al, 10d jl add_to sub al, 27h ; a f cmp al, 0ah jl exit cmp al, 10h jge exitadd_to: mov cl, 4 shl bx, cl mov ah, 0 add bx, ax jmp newcharexit: rethexibin endp32binidec proc near ; 210 mov cx, 10000d call dec_div mov cx, 1000d call dec_div mov cx, 100d call dec_div mov cx, 10d
20、 call dec_div mov cx, 1d call dec_div retbinidec endpdec_div proc near mov ax, bx mov dx, 0 div cx mov bx, dx mov dl, al add dl, 30h mov ah, 2 int 21h retdec_div endp33crlf proc near mov dl, 0ah mov ah, 2 int 21h mov dl, 0dh mov ah, 2 int 21h retcrlf endp hexidec ends end start34第六章作业Page 1771826.4 6.5 6.96.1335期中作业:(1) Hanoi塔的递归程序(2) Fibonacci数的递归程序(3) 字符串反序输出递归程序的改写(用STRUC伪操作)(4) 十六进制转换成十进制程序的改写(af、AF都接收)(1)(4)要求:* 源码 * 相应的输入/输出或Debug下的显示信息(5) 在屏幕上显示20000以内的素数及其个数 要求:* 采用子程序
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年山西省阳泉市单招职业倾向性考试题库带答案详解(新)
- 2026年广西体育高等专科学校单招职业适应性测试题库及答案详解(夺冠系列)
- 2026年广州科技贸易职业学院单招职业技能测试题库含答案详解(综合题)
- 2026年山西运城农业职业技术学院单招职业适应性测试题库含答案详解(能力提升)
- 2026年嵩山少林武术职业学院单招职业技能考试题库含答案详解(培优b卷)
- 2026年广西制造工程职业技术学院单招职业倾向性考试题库及答案详解(考点梳理)
- 2026年广东省深圳市单招职业适应性考试题库含答案详解(预热题)
- 2026年广东省清远市单招职业倾向性测试题库附参考答案详解(完整版)
- 2026年广东省肇庆市单招职业倾向性考试题库附答案详解(巩固)
- 某污水处理厂夜间值班办法
- 1.3 《利用磁铁辨别方向》 课件(内嵌视频) 2025-2026学年科学三年级下册教科版
- 2025-2026学年绘制校园地图教学设计
- 2026年安庆医药高等专科学校单招职业技能考试题库及答案解析
- 1.2《男生女生》课件 2025-2026学年道德与法治七年级下册 统编版
- 2026年及未来5年中国连续排放监测系统(CEMS)行业市场发展现状及投资方向研究报告
- 2026河北燕煤新能源有限公司面向社会招聘3人笔试备考题库及答案解析
- 工程部质量停止点检查方案说明
- 中班棉签画PPt
- 一年级下册音乐教案全册(人音版)
- (完整word版)施工升降机附墙架施工方案
- 轻型钢结构工程设计专项资质标准(共5页)
评论
0/150
提交评论