子程序设计 实验7
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验目的
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.
N
子程序 let 2 开始
显示提示 1
bx < - a x
bx 左移 4 位
查表 , 形成十六
进制数
显示十六进制数
显示 4 位 了 ?
ret 返回主
程序
Y
子程序 let 1 开始
键盘输
入
ESC ? 结束
Y
N
其它字
符 ?
形成十进制
数
保存 x
ret 返回主
程序
N
Y 主程序开始
数据段定义
初始化 , x = 0
start
显示提示 1
ax < - x
call let 1
call let 2
2.
主程序开始
数据段定义
初始化数据段,a<-count,si<-0
start
let0
取x,al<-x,call let2
out1
Inc si,dec
a
a>0 ?
是
否
结束
al<-al+30h dl<-al
否
子程序开始
bl bl rept1 al 左移4位,保留低4位 al>9 ? al<-al+37h 是ch=1 ? 否 是dl<-al 否 ch=0 ? ret,返回主 程序 是 四.代码 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