第6章 子程序结构
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Lea dx,string地址 地址(IP) 地址 Num string地址 地址
2010-12-28 ch6
从键盘取得十进制 保存到BX BX中 数,保存到BX中 显示回车和换行 用十六进制形式 显示BX BX中的数 显示BX中的数
7
计算机科学与技术系
《汇编语言》 汇编语言》
Decihex
segment
assume cs:Decihex Main proc far Repeat: push ds xor ax, ax push ax call decibin call crlf call binihex call crlf ret Main endp
通过堆栈传递地址或参数
计算机科学与技术系
《汇编语言》 汇编语言》
Binhex proc near push bp mov bp,sp push ax push di push bx push cx pushf mov ax, [bp+4] mov di, [bp+6] mov ch, 4 mov cl, 4 roat: rol ax ,cl mov bl, al and bl, 0fh add bl, 30h cmp bl, 39h jle next add bl, 7h 2010-12-28
;每次乘的 每次乘的
;结果在 中 结果在BX中 结果在
8
计算机科学与技术系
《汇编语言》 汇编语言》
Binihex proc near mov ch, 4 Rotate: mov cl, 4 rol bx, cl mov dl, bl and dl, 0fh add dl, 30h cmp dl, 3ah jl print add dl, 7h Print: mov ah, 2 int 21h dec ch jnz rotate ret 2010-12-28 Binihex endp
sp Bp-6 Bp-4 Bp-2 (Sp→)bp bp+2 bp+4 bp+6
; ax=25afh ; di=0002
flag cx bx di ax bp 0015 25af 0002
Lea dx,string地址 地址(IP) 地址 Num string地址 地址
ch6
14
计算机科学与技术系
例 6.4 主程序MAIN和过程PROADD在同一源文件中, 主程序MAIN和过程PROADD在同一源文件中, MAIN和过程PROADD在同一源文件中 要求用过程PROADD累加数组的所有元素, PROADD累加数组的所有元素 要求用过程PROADD累加数组的所有元素,并把和 不考虑溢出的可能性) (不考虑溢出的可能性)送到指定的存储单元中去
2010-12-28
ch6
10
计算机科学与技术系
《汇编语言》 汇编语言》 PROADD PROC PUSH PUSH PUSH PUSH LEA MOV XOR NEXT: ADD ADD LOOP MOV POP POP POP POP RET PROADD ENDP NEAR AX CX SI DI SI ,ARY ,ARY CX ,COUNT ,COUNT AX , AX AX , [SI] SI , 2 NEXT SUM , AX DI SI CX AX
2010-12-28 ch6 3
计算机科学与技术系
《汇编语言》 汇编语言》
6.1.2 子程序的调用和返回
如果调用程序和过程在同一代码段 同一代码段中 则使用NEAR属性 属性; 如果调用程序和过程在同一代码段中,则使用NEAR属性; MAIN PROC FAR … CALL SUBR1 RET MAIN ENDP ; SUBR1 PROC NEAR … RET SUBR1 ENDP
2010-12-28 ch6
CODE
ENDS
END START
11
计算机科学与技术系
《汇编语言》 汇编语言》
3
PROADD PROC NEAR PUSH AX CODE SEGMENT PUSH CX PUSH SI ARY DW 100 DUP(?) MOV SI , [BX] COUNT DW 100 MOV CX , [BX+2] SUM DW ? MOV DI , [BX+4] XOR AX , AX NUM DW 100 DUP (?) NEXT: ADD AX , [SI] N DW 100 ADD SI , 2 LOOP NEXT TOTAL DW ? MOV [DI], AX ; POP SI MOV TABLE , OFFSET ARY POP CX POP AX MOV TABLE+2, OFFSET COUNT RET MOV TABLE+4 , OFFSET SUN PROADD ENDP MOV BX , OFFSET TABLE CODE ENDS END START CALL PROADD ;计算SUM 计算SUM
《汇编语言》 汇编语言》
Next: mov [di], bl inc di dec ch jnz rota popf pop cx pop bx pop di pop ax pop bp ret 4 Binhex endp Code ends end begin
ch6
sp
sp
flag cx bx di ax bp 0015 25af 0002
2010-12-28
ch6
1
计算机科学与技术系
《汇编语言》 汇编语言》
子程序的结构
子程序的基本结构包括以下几个部分: 子程序的基本结构包括以下几个部分: (1)子程序定义 (2)保护现场和恢复现场 (3)子程序体 (4)子程序返回
2010-12-28
ch6
2
计算机科学与技术系
பைடு நூலகம்
《汇编语言》 汇编语言》
2010-12-28
Decibin proc near mov bx, 0 Newchar: mov ah, 1 int 21h sub al, 30h jl exit cmp al, 9 jg exit cbw xchg ax, bx mov cx, 10 mul cx xchg ax, bx add bx, ax jmp newchar Exit : ret Decibin endp ch6
6.1 子程序的设计方法
6.1.1 子程序的定义
子程序的定义是由过程定义伪指令PROC和 ENDP 子程序的定义是由过程定义伪指令PROC和 PROC 来完成的。其格式如下: 来完成的。其格式如下: 过程名 PROC [NEAR/FAR] ┆ 过程名 ENDP 其中PROC表示过程定义开始,ENDP表示过程定 PROC表示过程定义开始 其中 PROC 表示过程定义开始 , ENDP 表示过程定 义结束。过程名是过程入口地址的符号表示。 义结束。过程名是过程入口地址的符号表示。 一般过程名同标号一样,具有三种属性, 一般过程名同标号一样,具有三种属性,即段 属性、偏移地址属性以及类型属性( FAR)。 属性、偏移地址属性以及类型属性(NEAR 和 FAR)。
2010-12-28 ch6 12
通过地址表传递参数
计算机科学与技术系
《汇编语言》 汇编语言》
4
Data segment 2000:0000 Num dw 25afh 2000:0002· String db 4 dup(?), ‘$’, 0dh, 0ah 把内存中字变量num的值 的值, 例:把内存中字变量num的值, Data ends Stack segment para stack ‘stack’ 转换为4个用ASCⅡ 转换为4个用ASCⅡ码表示的 db 100 dup(?) 16进制数码,串的起始地址为 16进制数码 进制数码, Stack ends Code segment string 。 assume cs:code, ds:data, ss:stack Main proc far Begin: push ds 3000:0000 xor ax, ax 3000:0001 push ax 3000:0003 sp 15 mov ax,data Lea dx,string 3000:0004 地址( ) 地址(IP) mov ds, ax 3000:0007 00 lea bx, string 3000:0009 af Num push bx 3000:000d 25 push num 3000:000e 02 3000:0012 call binhex string地址 地址 00 lea dx, string 3000:0015 mov ah, 9 3000:0019 int 21h ret Main endp 2010-12-28 ch6 13
SEGX
SEGMENT
… SUBT PROC FAR … RET SUBT ENDP … CALL SUBT …
SEGX ENDS
;
SEGY
SEGMENT
… CALL SUBT
2010-12-28
… SEGY ENDS
ch6
5
计算机科学与技术系
《汇编语言》 汇编语言》
6.1.3 保护现场和恢复现场
Crlf
Crlf
proc near mov ah, 2 mov dl, odh int 21h mov dl, oah int 21h ret endp
Decihex ends
end repeat
ch6
9
计算机科学与技术系
《汇编语言》 汇编语言》
2 如果过程和调用过程在同一源文件(同一模块)中, 如果过程和调用过程在同一源文件(同一模块) 则过程可直接访问模块中的变量。 则过程可直接访问模块中的变量。
2010-12-28 ch6
MAIN
PROC FAR … CALL SUBR1 RET
SUBR1 PROC NEAR … RET SUBR1 ENDP MAIN ENDP
4
计算机科学与技术系
《汇编语言》 汇编语言》
如果调用程序和过程不在同一代码段中 则使用 调用程序和过程不在同一代码段中, 属性; 如果调用程序和过程不在同一代码段中,则使用FAR属性; 属性
计算机科学与技术系
《汇编语言》 汇编语言》
第6章 章
子程序结构
在程序设计中,我们会发现一些多次无规 在程序设计中 , 我们会发现一些 多次无规 律重复的程序段或语句序列。 律重复的程序段或语句序列 。 解决此类问题 一个行之有效的方法就是将它们设计成可供 一个行之有效的方法就是将它们设计成 可供 反复调用的独立的子程序结构, 反复调用的独立的子程序结构 , 以便在需要 时调用。在汇编语言中,子程序又称过程。 时调用。在汇编语言中,子程序又称过程。 调用子程序的程序称为主调程序或主程序。 调用子程序的程序称为主调程序或主程序。
DATA SEGMENT ARY DW 100 DUP (?) COUNT DW 100 SUM DW ? DATA ENDS
CODE SEGMENT
MAIN PROC FAR ASSUME CS:CODE , DS:DATA START: PUSH DS SUB AX ,AX PUSH AX MOV AX , DATA … CALL NEAR PTR PROADD … RET MAIN ENDP
;保护现场
•
;恢复现场 ;返回断点处
PROC
2010-12-28
ENDP
ch6 6
计算机科学与技术系
《汇编语言》 汇编语言》
6.1.4 主程序与子程序参数传递方式
1 通过寄存器传送参数 这是最常用的一种方式,使用方便,但参数很多时不能 这是最常用的一种方式,使用方便, 使用这种方法。 使用这种方法。 例:十进制到十六进制转换的程序。程序要求从键盘取 十进制到十六进制转换的程序。 得一个十进制数, 得一个十进制数,然后把该数以十六进制的形式在屏幕上显 示出来。 示出来。 开始 调用DECIBIN 调用CRLF 调用BINIHEX 调用CRLF 结束
例如:若子程序PROG中改变了寄存器 ,BX,CX,DX的值 中改变了寄存器AX 的值, 例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则 可采用如下方法保护和恢复现场。 可采用如下方法保护和恢复现场。
PROG
PROC
PUSH PUSH PUSH PUSH ┆ POP POP POP POP RET AX BX CX DX DX CX BX AX