- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
start:
push ds
sub ax, ax
push ax
mov ax, data
mov ds, ax
call near ptr proadd
ret
main endp
22
proadd proc near
push ax
push cx
push si
lea si, ary
mov cx, count
xor ax, ax
printit: mov dl, al
mov ah, 2
int 21h
dec ch
jnz rotate
ret
binihex endp
20
crlf proc near mov dl, 0dh mov ah, 2 int 21h mov dl, 0ah mov ah, 2 int 21h ret
crlf endp
(SP)→ (IP) (CS)
(IP) ← subp的偏移地址
15
int n (n : 中断类型号) int 21H
(1) 保存现场和返回地址 (2) 转中断处理程序
(IP) ← (n*4)
(CS) ← (n*4+2)
(SP)→ (IP) (CS) (PSW)
子程序返回(中断返回): (1)ret (2)iret
subr1 endp
code ends
main proc far ...... call subr1 ...... ret
subr1 proc near ...... ret
subr1 endp
main endp
code ends
12
例6.2 调用程序和子程序不在同一代码段中
segx segment subt proc far
...... ret subt endp ...... call subt ...... segx ends
segy segment
......
call subt
......
segy ends
13
保存与恢复寄存器
subt proc far
push ax push bx push cx push dx ...... pop dx pop cx pop bx pop ax
(2)FAR属性:调用程序和子程序不在同一代码段中 (段间调用)
11
例6.1 调用程序和子程序在同一代码段中
code segment
code segment
main proc far ...... call subr1 ...... ret
main endp
subr1 proc near ...... ret
jmp newchar
exit: ret
Байду номын сангаас
decibin endp
19
binihex proc near
; 216
mov ch, 4
rotate: mov cl, 4
rol bx, cl
mov al, bl
and al, 0fh
add al, 30h
cmp al, 3ah
jl printit
add al, 7h
next: add ax, [si]
add si, 2
loop next
mov sum, ax
pop si
pop cx
pop ax
ret
proadd endp
code ends
end start
23
如果数据段定义如下: data segment
ary count sum
dw 1,2,3,4,5,6,7,8,9,10 dw 10 dw ?
ary dw 10,20,30,40,50,60,70,80,90,100
count dw 10
sum dw ?
ary1 dw 10,20,30,40,50,60,70,80,90,100 count1 dw 10 sum1 dw ?
data ends
*如果直接访问内存变量,那么累加数组ary和数组ary1中 的元素不能用同一个子程序proadd
24
例6.4 累加数组中的元素(通过地址表传送变量地址)
data segment
ret
subt endp
14
子程序的调用和返回
子程序调用(中断调用):隐含使用堆栈保存返回地址
call near ptr subp
(1) 保存返回地址
(2) 转子程序 (IP) ← subp的偏移地址
(SP)→ (IP)
call far ptr subp
(1) 保存返回地址
(2) 转子程序 (CS) ← subp的段地址
16
子程序的变量传送
(1)通过寄存器传送变量 (2)通过存储器传送变量
*子程序和调用程序在同一程序模块中,则子程序可 直接访问模块中的变量。
*子程序和调用程序不在同一程序模块中,则有两种 传送方式:建立公共数据区和使用外部符号。
(3)通过地址表传送变量地址 (4)通过堆栈传送变量或变量地址
17
例6.3 十进制到十六进制的转换程序(通过寄存器传送变量)
18
decibin proc near
; 102
mov bx, 0
newchar: mov ah, 1
int 21h
sub al, 30h
jl exit
; <0退出
cmp al, 9d
jg exit
; >9退出
cbw
xchg ax, bx
mov cx, 10d
mul cx
xchg ax, bx
add bx, ax
decihex ends end main
21
例6.4 累加数组中的元素(直接访问变量) data segment
ary dw 1,2,3,4,5,6,7,8,9,10
count dw 10
sum dw ?
data ends
code segment
main proc far
assume cs:code, ds:data
decihex segment
; 1016
assume cs: decihex
main proc far push ds sub ax, ax push ax
repeat: call decibin ; 102 call crlf call binihex ; 216 call crlf
jmp repeat ret main endp
经典童话故事·卖火柴 的小女孩·家庭情景剧
剧本(版)
第六章 子程序结构
6.1 子程序的设计方法
过程(子程序)定义伪操作
procedure_name PROC NEAR ( FAR ) ……
procedure_name ENDP
(1)NEAR属性:调用程序和子程序在同一代码段中 (段内调用)