出口参数:子程序返回给主程序的处理结果的数据,子程序的输出数据
现场:主程序在跳转子程序前使用到的资源,包括:寄存器、存储器里的数据
保护:避免子程序在执行时修改寄存器内存,造成返回主程序后现场变动,从而导致程序运行错误,故需要对现场保护
注意点:
1.将AX中的值以十六进制形式显示。要求:主程序利用寄存器把AX的值传送给子程序。
在子程序中将AX中的值以十六进制形式显示。
=====================================
DATA SEGMENT
D1 DW 13276 数: 0~65535
DATA ENDS
------------------------------
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
------------------------------
MOV AX, D1取来数字.
CALL DISP_AX
MOV DL, 'H'
MOV AH, 2
INT 21H 输出H
------------------------------
MOV AH, 4CH
INT 21H 返回DOS
------------------------------
DISP_AX:
MOV BX, 1616进制,要除16
MOV CX, 4 求4位16进制数.
ABC:
CWD将AX扩展到DX
DIV BX
PUSH DX保存余数到堆栈.
LOOP ABC
MOV CX, 4 显示4位.
ASD:
POP DX
CMP DL, 10
JB A48
ADD DL, 7
A48:
ADD DL, 48
MOV AH, 2
INT 21H 输出.
LOOP ASD
RET
------------------------------
CODE ENDS
END START
===========================
2.编写子程序,完成的功能是将DL中的2位十六进制数转换为对应ASCII码。
说明:入口参数AL=待转换的2位十六进制数
出口参数DX=转换后的ASCII码,(高字节对应高位、低字节对应低位)
举例:若AL=2AH,则DX=3241H。
0----9转换为30H----39H +30H
A---F转换为41H----4FH +30H+7H
------------------------------
AL_ASC_DX:
MOV AH, 0 要除16
MOV CL, 16求16进制数.
DIV CL
CMP AL, 10
JB A48
ADD AL, 7
A48:
ADD AL, 48
MOV DH, AL
CMP AH, 10
JB A482
ADD AH, 7
A482:
ADD AH, 48
MOV DL, AH
RET
------------------------------
实验七 子程序设计(1)(一)实验目的
1、掌握子程序的设计方法和调用方式
2、深刻认识堆栈在子程序设计中所起的作用
3、掌握子程序调试的技巧。
(二)实验设备
同实验二
(三)实验内容和要求
实验内容:
内存中有一字节型无符号数缓冲区Data,长度为100。将Data缓冲区显示到屏幕上,分别用二进制,十进制和十六进制。要求:
1.编写子程序将一个字节数用二进制进行显示,参数用内存数传递;
2.编写子程序将一个字节数用十进制进行显示,参数用寄存器数传递;
3.编写子程序将一个字节数用十六进制进行显示,参数用堆栈传递;
(四)预习要求
同实验二
(五)实验步骤
同实验二
(六)实验结果分析
1、理解3种参数传递方式各有什么特点
2、绘制一般子程序的结构。
(七)编程提示
(a) 二进制显示可采用移位并判断该位的方式进行。
(b) 十进制数采用除以10取商的方式。
(c) 十六进制数可利用二进制转换位十六进制的方法进行。
(d) 注意去掉最高位的“0”。
目前只做了1和2
DSEGsegment
data db 101,1,2,3,4,5,6,7,8,9,90 dup(5)
msg db ',','$'
msg1 db 'please choose operation','$'
msg2 db '0:bit-data 1:dec-data 2:hex-data','$'
addrtbl dw bdata,ddata,hdata
dseg ends
csegsegment
assume cs:cseg,ds:dseg
start:
mov ax,dseg
mov ds,ax
lea dx,msg1
mov ah,9
int 21h
mov dl,0ah
mov ah,2
int 21h
lea dx,msg2
mov ah,9
int 21h
mov ah,1
int 21h
sub al,30h
mov ah,0
shl ax,1
mov bx,ax
jmp addrtbl[bx]
mov si,0
ddata:
mov dl,' '
mov ah,2
int 21h
mov cx,100
nextt: mov bl,data[si]
mov bh,0
inc si
call progdec
loop nextt
jmp done
hdata:
bdata:
callprogbit
done:mov ah,4ch
int 21h
progdec proc
push ax
push dx
push bx
mov dl,100
mov ax,bx
div dl
cmp al,0
jne hundred
mov ax,bx
mov dl,10
div dl
cmp al,0
jne ten
mov dl,bl
add dl,30h
mov ah,2
int 21h
jmp exit
ten:
mov dl,al
add dl,30h
mov bx,ax
mov ah,2
int 21h
mov dl,bh
add dl,30h
mov ah,2
int 21h
jmp exit
hundred:
mov dl,al
mov bx,ax
add dl,30h
mov ah,2
int 21h
mov ah,bh
mov al,ah
mov ah,0
mov dl,10
div dl
mov dl,al
add dl,30h
mov bx,ax
mov ah,2
int 21h
mov dl,bh
add dl,30h
mov ah,2
int 21h
jmp exit
exit:
mov dl,' '
mov ah,2
int 21h
pop bx
pop dx
pop ax
ret
progdec endp
progbit proc
push ax
push bx
push cx
push dx
push si
mov si,0
ok:
mov bh,data[si]
mov cx,8
ok1:mov dl,30h
shl bh,1
jnc skip
inc dl
skip: mov ah,2
int 21h
loop ok1
next: lea dx,msg
mov ah,9
int 21h
inc si
cmp si,100
jb ok
pop si
pop dx
pop cx
pop bx
pop ax
ret
progbit endp
cseg ends
endstart
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)