PowerPoint 演示文稿

Download Report

Transcript PowerPoint 演示文稿

安徽理工大学 计算机科学与技术系
第6章
李敬兆
《汇编语言》 第6章
子程序结构
在程序设计中,我们会发现一些多次无规
律重复的程序段或语句序列。解决此类问题
一个行之有效的方法就是将它们设计成可供
反复调用的独立的子程序结构,以便在需要
时调用。在汇编语言中,子程序又称过程。
调用子程序的程序称为主调程序或主程序。
2015/7/17
ch6
1
安徽理工大学 计算机科学与技术系
李敬兆
《汇编语言》 第6章
子程序的结构
子程序的基本结构包括以下几个部分:
(1)子程序定义
(2)保护现场和恢复现场
(3)子程序体
(4)子程序返回
2015/7/17
ch6
2
安徽理工大学 计算机科学与技术系
李敬兆
《汇编语言》 第6章
6.1 子程序的设计方法
6.1.1 子程序的定义
子程序的定义是由过程定义伪指令PROC和ENDP
来完成的。其格式如下:
过程名 PROC [NEAR/FAR]
┆
过程名 ENDP
其中PROC表示过程定义开始,ENDP表示过程定
义结束。过程名是过程入口地址的符号表示。
一般过程名同标号一样,具有三种属性,即段
属性、偏移地址属性以及类型属性(NEAR 和 FAR)。
2015/7/17
ch6
3
安徽理工大学 计算机科学与技术系
李敬兆
《汇编语言》 第6章
6.1.2 子程序的调用和返回
如果调用程序和过程在同一代码段中,则使用NEAR属性;
MAIN
PROC FAR
…
CALL SUBR1
RET
MAIN ENDP
;
SUBR1 PROC NEAR
…
RET
SUBR1
ENDP
2015/7/17
MAIN
PROC FAR
…
CALL SUBR1
RET
SUBR1 PROC NEAR
…
RET
SUBR1
ENDP
MAIN ENDP
ch6
4
安徽理工大学 计算机科学与技术系
李敬兆
《汇编语言》 第6章
如果调用程序和过程不在同一代码段中,则使用FAR属性;
SEGX
SEGMENT
…
SUBT PROC FAR
…
RET
SUBT ENDP
…
CALL SUBT
…
SEGX
ENDS
;
SEGY
2015/7/17
SEGY
SEGMENT
…
CALL SUBT
…
ENDS
ch6
5
安徽理工大学 计算机科学与技术系
李敬兆
《汇编语言》 第6章
6.1.3 保护现场和恢复现场
例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则
可采用如下方法保护和恢复现场。
PROG
•
PROC
2015/7/17
PROC
PUSH
PUSH
PUSH
PUSH
┆
POP
POP
POP
POP
RET
AX
BX
CX
DX
DX
CX
BX
AX
;保护现场
;恢复现场
;返回断点处
ENDP
ch6
6
安徽理工大学 计算机科学与技术系
李敬兆
《汇编语言》 第6章
6.1.4 主程序与子程序参数传递方式
1 通过寄存器传送参数
这是最常用的一种方式,使用方便,但参数很多时不能
使用这种方法。
例:十进制到十六进制转换的程序。程序要求从键盘取
得一个十进制数,然后把该数以十六进制的形式在屏幕上显
示出来。
开始
从键盘取得十进制
数,保存到BX中
调用DECIBIN
调用CRLF
显示回车和换行
调用BINIHEX
用十六进制形式
显示BX中的数
调用CRLF
2015/7/17
结束
ch6
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
2015/7/17
李敬兆
《汇编语言》 第6章
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
ch6
Decibin
endp
;每次乘的
;结果在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
2015/7/17
Binihex endp
李敬兆
Crlf
Crlf
《汇编语言》 第6章
proc near
mov ah, 2
mov dl, odh
int 21h
mov dl, oah
int 21h
ret
endp
Decihex ends
end repeat
ch6
9
安徽理工大学 计算机科学与技术系
李敬兆
《汇编语言》 第6章
2 如果过程和调用过程在同一源文件(同一模块)中,
则过程可直接访问模块中的变量。
例 6.4 主程序MAIN和过程PROADD在同一源文件中,
要求用过程PROADD累加数组的所有元素,并把和
(不考虑溢出的可能性)送到指定的存储单元中去
2015/7/17
ch6
10
安徽理工大学 计算机科学与技术系
李敬兆
PROADD PROC
PUSH
PUSH
PUSH
PUSH
LEA
MOV
XOR
NEXT:
ADD
ADD
LOOP
MOV
POP
POP
POP
POP
RET
PROADD ENDP
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
2015/7/17
《汇编语言》 第6章
ch6
CODE
NEAR
AX
CX
SI
DI
SI ,ARY
CX ,COUNT
AX , AX
AX , [SI]
SI , 2
NEXT
SUM , AX
DI
SI
CX
AX
ENDS
END START
11
安徽理工大学 计算机科学与技术系
3
李敬兆
《汇编语言》 第6章
通过地址表传递参数
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
2015/7/17
ch6
12
安徽理工大学 计算机科学与技术系
李敬兆
《汇编语言》 第6章
segment
4 通过堆栈传递地址或参数 Data
2000:0000
Num
dw 25afh
2000:0002·
String db 4 dup(?), ‘$’, 0dh, 0ah
例:把内存中字变量num的值, Data ends
Stack segment para stack ‘stack’
转换为4个用ASCⅡ码表示的
db 100 dup(?)
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
2015/7/17
ch6
13
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
2015/7/17
add bl, 7h
李敬兆
《汇编语言》 第6章
sp
Bp-6
Bp-4
Bp-2
(Sp→)bp
; ax=25afh
; di=0002
bp+2
bp+4
bp+6
ch6
flag
cx
bx
di
ax
bp
0015
25af
0002
Lea dx,string地址(IP)
Num
string地址
14
安徽理工大学 计算机科学与技术系
李敬兆
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
2015/7/17
《汇编语言》 第6章
sp
sp
flag
cx
bx
di
ax
bp
0015
25af
0002
Lea dx,string地址(IP)
Num
string地址
ends
end begin
ch6
15
安徽理工大学 计算机科学与技术系
例3:求10个数的累加值.
李敬兆
《汇编语言》 第6章
--------远调用
Data
Ary
Count
Sum
Data
Stack
segment
db 10 dup(?)
db 10
db ?
ends
segment para stack ‘stack’
db 100 dup(?)
Stack ends
Code1 segment
assume cs:code1, ds:data, ss;stack
Main proc far
Start: push ds
xor ax, ax
push ax
mov ax, data
mov ds, ax
2015/7/17
ch6
16
安徽理工大学 计算机科学与技术系
李敬兆
Mov bx, offset ary
Push bx
Mov bx, offset count
Push bx
Mov bx, offset sum
Push bx
Call far ptr proadd
mov al, sum
mov dl, al
mov ah, 2
int 21h
ret
Main endp
Code1 ends
2015/7/17
sp
《汇编语言》 第6章
IP
CS
MOV AL, SUM 地址
Sum地址
Count地址
Ary地址
ch6
17
安徽理工大学 计算机科学与技术系
Code2 segment
assume cs:code2
Proadd proc far
push bp
mov bp, sp
push ax
push cx
push si
push di
mov si, [bp+0ah]
mov di, [bp+08h]
mov cl, [di]
mov di, [bp+06h]
xor al, al
Again: add al, [si]
inc si
dec cl
jnz again
mov [di], al
pop di
pop si
2015/7/17pop cx
李敬兆
sp
(Sp→)bp
《汇编语言》 第6章
di
si
cx
ax
bp
IP
CS
[bp+06h]
[bp+08h]
[bp+0ah]
MOV AL, SUM 地址
Sum地址
Count地址
Ary地址
pop ax
pop bp
ret 6
Proadd endp
Code2 ends
ch6
end start
18
安徽理工大学 计算机科学与技术系
5
李敬兆
《汇编语言》 第6章
多个模块之间的参数传送问题
(1) PUBLIC伪指令
格式:PUBLIC 符号 [,符号]
功能:说明其后的符号是全局符号。全局符号能被其他模
块引用。(局部符号)
(2) EXTRN伪指令
格式:EXTRN 符号:类型 [,符号:类型]
功能:说明在本模块中需要引用的、由其他模块定义的符
号,即外部符号。
2015/7/17
ch6
19
安徽理工大学 计算机科学与技术系
source module 1
extrn a:word
Data1 segment
b dw ?
Data1 ends
code1 segment
assume cs:code1,ds:data1
Main proc far
start: mov ax , data1
mov ds,ax
…
mov ah,4ch
int 21h
Main endp
Code1 ends
End start
李敬兆
《汇编语言》 第6章
source module 2
public a
Data2 segment
a dw ?
Data2 ends
code2 segment
assume cs:code2,ds:data2
Main proc far
start: mov ax , data2
mov ds,ax
…
mov ah,4ch
int 21h
Main endp
Code2 ends
End start
注意:应先有public 定义,然后才有extrn说明
2015/7/17
ch6
20
安徽理工大学 计算机科学与技术系
李敬兆
《汇编语言》 第6章
例:用模块化程序设计方法建立两个模块MOD1 ASM和MOD2 ASM的数据通讯。
NAME
MOD1
EXTRN
DISP:FAR
PUBLIC STR1,N ,BUF
DATA1 SEGMENT
STR1
DB
‘HOW DO YOU DO?’
N
=
$-STR1
BUF
DB
‘THIS IS AN EXAMPLE OF MODULES PROGRAM $′
DATA
ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE1 SEGMENT
ASSUME CS:CODE1,DS:DATA1,SS:STACK
START: MOV
AX,DATA
MOV
DS,AX
CALL
DISP
MOV
AH,4CH
INT
21H
CODE1 ENDS
2015/7/17
ch6
END
START
21
安徽理工大学 计算机科学与技术系
NAME
李敬兆
《汇编语言》 第6章
MOD2
EXTRN
PUBCIC
DATA2
STR2
DATA2
CODE2
STR1:BYTE,STR2:BYTE,N:ABS
DISP
SEGMENT
DB 81 DUP(0)
ENDS
SEGMENT
ASSUME CS:CODE2,ES:DATA2
DISP
PROC
FAR
MOV
AX,DATA2
MOV
ES,AX
LEA
BX,STR1
MOV
CX,N
LEA
SI,STR2
NEXT: MOV
AL,[BX]
MOV
ES:[SI],AL
INC
BX
INC
SI
LOOP
NEXT
2015/7/17
ch6
LEA
DISP
CODE2
DX,BUF
MOV
AH,9
INT
21H
RET
ENDP
ENDS
END
22
安徽理工大学 计算机科学与技术系
6.1.5
Procname
李敬兆
《汇编语言》 第6章
增强功能的过程定义伪操作
PROC
[attributes field] [USER register list]
[,parameter field]
…
Procname
Attributes
ENDP
field(属性字段)包括:
Distance :
Language
near
、far
Visibility
type :说明是那种高级语言的子程序 如pascal 、c 等。
:
说明程序的可见性 是private 或是public。
Prologue :是一个宏的名字,允许用宏来控制过程的入口或出口有关的代码
USER:该字段用来指定用户所需保存和恢复的寄存器表。
Parameter field: 参数字段 ,允许用户指定该过程所用的参数 。
2015/7/17
标识符:类型[,标识符:类型]
ch6
23
安徽理工大学 计算机科学与技术系
李敬兆
《汇编语言》 第6章
例6 .4 用增强功能过程定义伪操作实现
Data
Ary
Count
Sum
Data
Stack
segment
db 10 dup(?)
db 10
db ?
ends
segment para stack ‘stack’
db 100 dup(?)
Stack ends
Code1 segment
assume cs:code1, ds:data, ss:stack
Main proc far
Start: push ds
xor ax, ax
push ax
mov ax, data
mov ds, ax
2015/7/17
ch6
Mov bx, offset ary
Push bx
Mov bx, offset count
Push bx
Mov bx, offset sum
Push bx
Call far ptr proadd
mov al, sum
mov dl, al
mov ah, 2
int 21h
ret
Main endp
Code1 ends
24
安徽理工大学 计算机科学与技术系
Code2 segment
assume cs:code2
Proadd proc far
push bp
mov bp, sp
push ax
push cx
push si
push di
mov si, [bp+0ah]
mov di, [bp+08h]
mov cl, [di]
mov di, [bp+06h]
xor al, al
Again: add al, [si]
inc si
dec cl
jnz again
mov [di], al
pop di
pop si
pop cx
pop ax
pop bp
ret 6
Proadd endp
Code2 ends
2015/7/17
end start
李敬兆
《汇编语言》 第6章
Code2 segment
assume cs:code2
Proadd proc pascal user ax cx si di ,
para:word,parc:word,pars:word
mov si, para
mov di, parc
mov cl, [di]
mov di, pars
xor al, al
Again: add al, [si]
inc si
( bp -2)
dec cl
(bp)
jnz again
mov [di], al mov al, sum( bp +2)
( bp +4)
ret
para ( bp +6)
Proadd endp
Code2 ends
parc ( bp +8)
end start
pars( bp +a)
ch6
di
si
cx
ax
局部
变量
原始bp
IP
CS
Sum地址
Count地址
Ary地址
25
安徽理工大学 计算机科学与技术系
李敬兆
《汇编语言》 第6章
增强功能的过程定义伪操作除了以上功能外 ,还可以在
过程中定义局部变量。局部变量是在过程内部使用的变量,
他是在过程调用是在堆栈中建立的,在退出过程是被释放。
可以用 LOCAL 定义
LOCAL
变量:类型[,变量:类型]
( bp -4)
( bp -2)
(bp)
( bp +2)
( bp +4)
( bp +6)
( bp +8)
( bp +a)
2015/7/17
ch6
局部
变量
原始bp
IP
CS
Sum地址
Count地址
Ary地址
26
安徽理工大学 计算机科学与技术系
6.2
李敬兆
《汇编语言》 第6章
子程序的嵌套
一个子程序可以作为调用程序去掉用另一个子程序,这种
情况称为子程序的嵌套。嵌套深度不限。但应注意什么问题?
堆栈溢出:上溢、下溢
递归子程序:如果一个子程序调用的是子程序的本身,就是递
归子程序。
2015/7/17
ch6
27
安徽理工大学 计算机科学与技术系
李敬兆
例5: 计算 N!=N*(N-1)*(N-2)* ……*1
《汇编语言》 第6章
--------递归子程序
Data segment
Num db 3
Result dw ?
Data ends
Stack segment para stack ‘stack’
db 100 dup(?)
Stack ends
Code segment
assume cs:code, ds:data, ss:stack
Main proc far
Begin: push ds
xor ax, ax
push ax
mov ax, data
mov ds, ax
2015/7/17
ch6
28
安徽理工大学 计算机科学与技术系
Main
李敬兆
《汇编语言》 第6章
mov ah, 0
mov al, num
call factor
mov result, ax
ret
endp
Factor proc
push ax
sub ax, 1
jne f_cont
pop ax
jmp return
f_cont: call factor
pop cx
mul cl
return: ret
factor endp
Code ends
2015/7/17end begin
ax =1
IP
ax*cx =1*2
IP
ax*cx =1*2*3
IP
ch6
POP CX 地址
cx =2
POP CX 地址
cx =3
Mov result, ax 地址
1
IP3
Pop cx 地址
2
IP2
Pop cx 地址
3
IP1
Mov result, ax 地址
29
安徽理工大学 计算机科学与技术系
李敬兆
《汇编语言》 第6章
常用的DOS系统功能调用
•
•
•
•
•
•
2015/7/17
1.单字符输入(1号调用)
2.单字符显示(2号调用)
3.打印输出(5号调用)
4.结束调用(4CH号调用)
5.显示字符串(9号调用)
6.字符串输入(10号调用)
ch6
30
安徽理工大学 计算机科学与技术系
李敬兆
《汇编语言》 第6章
•1.单字符输入(1号调用)
格式:MOV AH,1
INT 21H
功能:从键盘输入字符的ASCII码送入寄存器AL中,并
送显示器显示。
• 2.单字符显示(2号调用)
格式:MOV DL,待显示字符的ASCII码
MOV AH,2
INT 21H
功能:将DL寄存器中的字符送显示器显示.
2015/7/17
ch6
31
安徽理工大学 计算机科学与技术系
李敬兆
《汇编语言》 第6章
• 3.打印输出(5号调用)
格式:MOV
DL,待打印字符的ASCII码
MOV
AH,5
INT
21H
• 功能:将DL寄存器中的字符送打印机打印。
• 4.结束调用(4CH号调用)
格式:MOV
AH,4CH
INT
21H
功能:终止当前程序并返回调用程序。
2015/7/17
ch6
32
安徽理工大学 计算机科学与技术系
李敬兆
《汇编语言》 第6章
• 5.显示字符串(9号调用)
格式:LEA
DX,待显示字符串首偏移地址
MOV
AH,9
INT
21H
功能:将当前数据区中以‘$’结尾的字符串送显示器显示。
• 6.字符串输入(10号调用)
格式:LEA
DX,缓冲区首偏移地址
MOV
AH,10
INT
21H
功能:从键盘上输入一字符串到用户定义的输入缓冲区中,并送显示器显示。
maxlen db 32
actlen db ?
string db 32 dup(?)
lea dx , maxlen
mov ah,0ah
int 21h
2015/7/17
说明:缓冲区的第一个字节保存最大字符数,这个最
大字符数由用户程序给出。如果键入的字符数
比此数大,机器发出嘟嘟声。第二个字节存放
实际输入的字节数,这个不是由用户填入的而
由功能A填入的。在这两个字节之后,才是我们
输入的字符串。
ch6
33
安徽理工大学 计算机科学与技术系
6.3
李敬兆
《汇编语言》 第6章
子程序举例
例1:HEXIDEX是一个十六进制数转换成十进制数的程序。要求把从键盘输
入的0 — FFFFH的十六进制正数转换为十进制数并在屏幕上显示出来。
Display equ 2h
Key
equ 1h
Doscall equ 21h
Hexidec segment
Main proc far
assume cs:hexidec
Start:
push ds
sub ax,ax
push ax
call hexidec
call crlf
call binidec
call crlf
jmp main
2015/7/17 ret
main endp
Crlf proc near
mov dl ,0ah
mov ah,display
int boscall
mov dl,0dh
mov ah,display
int doscall
ret
crlf endp
Hexidec ends
end start
ch6
34
安徽理工大学 计算机科学与技术系
Hexidec proc near
mov bx ,0
Newchar: mov key_in
int doscall
sub al,30h
jl exit
cmp al, 10d
jl add_to
sub al ,27h
cmp al,0ah
jl exit
cmp ah,10h
jge exit
Add_to: mov cl ,4
shl bx , cl
mov ah ,0
add bx,ax
jmp
Exit:
Ret
2015/7/17
Hexidec
endp
李敬兆
《汇编语言》 第6章
Binidec proc near
mov cx , 10000d
call dec_div
mov cx , 1000d
call dec_div
mov cx,100d
call dec_div
mov cx,10d
call dec_div
mov cx,1d
call dec_div
ret
Dec_div proc near
mov ax, bx
mov dx ,0
div cx
mov bx,dx
mov dl,al
add dl,30h
mov ah,display
int doscall
ch6
ret
dec_div endp
Binidec endp
35
安徽理工大学 计算机科学与技术系
李敬兆
《汇编语言》 第6章
例2:一个简单的信息检索系统。在数据区里,有10个不同的信
息,编号为0—9,每个信息包括30个字符。现在要编制一个程
序:从键盘接收0—9之间的一个编号,然后在屏幕上显示相应
编号的信息的内容。
Datarea segment
thirty db 30
msg0 db ‘ 0 I like my IBM-PC--------------’
msg1 db ‘ 1 I like my IBM-PC--------------’
msg2 db ‘ 2 I like my IBM-PC--------------’
msg3 db ‘ 3 I like my IBM-PC--------------’
msg4 db ‘ 4 I like my IBM-PC--------------’
msg5 db ‘ 5 I like my IBM-PC--------------’
msg6 db ‘ 6 I like my IBM-PC--------------’
msg7 db ‘ 7 I like my IBM-PC--------------’
msg8 db ‘ 8 I like my IBM-PC--------------’
msg9 db ‘ 9 I like my IBM-PC--------------’
errmsg db ‘error!!! Invalid praameter’
Datarea ends
2015/7/17
ch6
36
安徽理工大学 计算机科学与技术系
李敬兆
《汇编语言》 第6章
Stack segment
Mov bx,offset msg0
db 256 dup(0)
Mul thirty
tos lable word
Add bx,ax
Stack ends
Call display
Prognam segment
Jmp begin
assume cs:prognam ,ds:datarea,ss:stack Error: mov bx,offset errmsg
Start: push ds
call display
xor ax,ax
ret
push ax
Display proc near
mov ax,stack
mov cx,30
mov ss,ax
mov dl,[bx]
mov ax,datarea
call dispchar
mov ds,ax
inc bx
mov sp,offset tos
loop disp1
Begin:mov ah,1
mov dl,0dh
int 21h
call dispchar
sub al,’0’
mov dl,0ah
jc error
call dispchar
cmp al, ‘9’
ret
ja error
Dispchar endp
2015/7/17
ch6
Dispchar proc naer
mov ah,2
int 21h
ret
Dispchar endp
Main endp
Prognam ends
End start
37
安徽理工大学 计算机科学与技术系
李敬兆
《汇编语言》 第6章
例3:人名排序程序。先从终端键入最多30个人名,
当所有人名都进入后,按字母上升的次序将人名排
序,并在屏幕上显示已经排好的人名。
2015/7/17
ch6
38
安徽理工大学 计算机科学与技术系
李敬兆
Data segment
namepar label byte
maxnlen db 21
namelen
db ?
namefld
db 21 dup(?)
crlf
db 13,10,’$’
endaddr
dw ?
messg1
db ‘name?’,’$”
messg2
db ‘sorted names’,13,10,’$’
namectr
db 0
nametab db 30 dup (20 dup(‘ ’))
namesav db 20 dup (?),13,10,’$’
swapped
db 0
Data ends
Code segment
main proc far
assume cs:code,ds:data,es:data
start:push ds
mov ax,0
push ax
2015/7/17
《汇编语言》 第6章
mov ax,data
mov ds,ax
mov es,ax
cld
lea di,nametab
a20loop:call b10read
cmp namelen,0
jz a30
cmp namectr,30
je a30
call d10stor
jmp a20loop
a30:cmp namectr,1
jbe a40
call g10sort
call k10disp a40:mov ah,4ch
Int 21h
Main endp
ch6
39
安徽理工大学 计算机科学与技术系
b10read proc near
d10stor
mov ah,09
lea dx ,messg1
int 21h
mov ah,0ah
lea dx,namepar
int 21h
mov ah,09h
p10stor
lea dx crlf
g10sort
Int 21h
mov bx,0
mov bl ,namelen
mov cx,21
sub cx,bx
b20: mov namefld[bx],20h
inc bx
loop b20
ret
2015/7/17 endp
b10read
李敬兆
proc near
inc namectr
cld
lea si , namectr
mov cx,10
rep movsw
ret
endp
proc near
sub di ,40
mov endaddr,di
g20: mov swapped,0
lea si,nametab
g30: mov cx,20
mov di,si
add di,20
add ax,di
mov ax,di
mov bx,si
ch6
repe cmpsb
《汇编语言》 第6章
jbe g40
call h10xchg
g40: mov si,ax
cmp
swapped,0
jnz g20
ret
G10sort endp
40
安徽理工大学 计算机科学与技术系
h10xchg proc near
mov cx,10
lea di , namesav
mov si,bx
rep movsw
mov cx,10
mov di,bx
rep movsw
mov cx ,10
lea si,namesav
rep movsw
mov swapped,1
ret
h10xchg endp
2015/7/17
李敬兆
《汇编语言》 第6章
k10disp proc near
mov ah,09
lea dx,messg2
int 21h
lea si,nametab
lea di,namesav
mov cx,10
rep movsw
mov ah,09
lea dx, namesav
int 21h
dec namectr
jnz k20
ret
K10disp endp
end start
ch6
41
安徽理工大学 计算机科学与技术系
李敬兆
《汇编语言》 第6章
第六章 作业
6.1
6.2
6.3
6.7
2015/7/17
ch6
42