一、实验目的
1.掌握CALL指令的使用方法。
2.掌握子程序的定义
3.掌握主程序与子程序之间的调用关系及其调用方法
4.掌握主程序与子程序间参数的传递方法(寄存器、存储器、堆栈)
二、实验内容
1.将AX中的值以十六进制形式显示。
要求:
➢主程序利用寄存器把AX的值传送给子程序。
➢在子程序中将AX中的值以十六进制形式显示。
2.编写子程序,完成的功能是将DL中的2位十六进制数转换为对应ASCII
码。
说明:入口参数AL=待转换的2位十六进制数
出口参数DX=转换后的ASCII码,(高字节对应高位、低字节对
应低位)
举例:若AL=2AH,则DX=3241H。
0----9转换为30H----39H +30H
A---F转换为41H----4FH +30H+7H
三、程序流程图
1.
2.
是
否四.代码
1.
data segment
x dw 0
mess1 db 0dh,0ah,'input dec = $'
mess2 db 0dh,0ah,'out HEX = $'
hex db '0123456789ABCDEF'
data ends
CODE SEGMENT 'CODE'
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
let0: mov x,0
mov dx,offset mess1
mov ah,9
int 21h
call let1
mov ax,x
call let2
jmp let0
let1: ;键盘输入数并转换十进制数,入口参数ah,出口参数x mov ah,1
int 21h
cmp al,27
jz out1
sub al,30h
jl exit
cmp al,9
jg exit
mov ah,0
xchg ax,x
mov cx,10
mul cx
xchg ax,x
add x,ax
jmp let1
exit:ret
let2: ;显示十六进制数,入口参数ax,出口参数dl
mov dx,offset mess2
mov bx,ax
mov ah,9
int 21h
mov ch,4
mov cl,4
rept1:
rol bx,cl
mov al,bl
and ax,000fh
mov si,ax
mov dl,hex[si]
mov ah,2
int 21h
dec ch
jnz rept1
ret
out1:
mov ah,4ch
int 21h
code ends
end start
2.
data segment
x db 12h,3ah,0b4h
count=$-offset x
a d
b ?
data ends
CODE SEGMENT 'CODE'
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
mov a,count
mov si,0
let0:
mov al,x[si]
call let2
jmp out1
let2: ;将dl中的两位十六进制数转化成对应的ASC2码,入口参
数:al,出口参数:dx
mov ch,2
mov cl,4
mov bl,al
rept1:
rol bl,cl
mov al,bl
and al,0fh
cmp al,9
jl let1
add al,37h cmp ch,1
jz let3
mov dh,al dec ch
jnz rept1
let1:
add al,30h cmp ch,1 jz let3
mov dh,al dec ch
jnz rept1
let3:
mov dl,al dec ch
jnz rept1 ret
out1:
add si,1 dec a
cmp a,0
jnz let0 mov ah,4ch int 21h
code ends end start
五.实验结果
1.
初始状态:
调用子程序,ip=0015进栈:
利用ax给子程序传值:
子程序完毕,ip出栈:ip=0015
直接运行时:
2.
初始状态:
调用子程序,ip=0014进栈:
3a的ASC2码显示:
子程序完毕,ip出栈:ip=0014
六、实验总结
通过本次实验,进一步认识汇编语言和这个集成开发环境,并对汇编语言的基本语
法更加熟悉,了解了CALL指令的使用方法,掌握子程序的定义,主程序与子程序之间
的调用关系及其调用方法,主程序与子程序间参数的传递方法.
.。