实验七 子程序设计(1)
(一)实验目的
1、掌握子程序的设计方法和调用方式
2、深刻认识堆栈在子程序设计中所起的作用
3、掌握子程序调试的技巧。
(二)实验设备
同实验二
(三)实验内容和要求
实验内容:
内存中有一字节型无符号数缓冲区Data,长度为100。将Data缓冲区显示到屏幕上,分别用二进制,十进制和十六进制。要求:
1.编写子程序将一个字节数用二进制进行显示,参数用内存数传递;
2.编写子程序将一个字节数用十进制进行显示,参数用寄存器数传递;
3.编写子程序将一个字节数用十六进制进行显示,参数用堆栈传递;
(四)预习要求
同实验二
(五)实验步骤
同实验二
(六)实验结果分析
1、理解3种参数传递方式各有什么特点
2、绘制一般子程序的结构。
(七)编程提示
(a) 二进制显示可采用移位并判断该位的方式进行。
(b) 十进制数采用除以10取商的方式。
(c) 十六进制数可利用二进制转换位十六进制的方法进行。
(d) 注意去掉最高位的“0”。
目前只做了1和2
DSEG segment
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
cseg segment
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:
call progbit
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
end start
你这样理解中断:你正在写作文,正在脑中构思题目和内容。这时突然有人叫你去扫地,但你快构思好的作文还在脑中没写下来,你可能在纸上简单记下作文的题目和一些大概内容才去扫地,不然等你扫完地回来脑里的东西全忘光了你还记得你要写些什么吗?中断保存FLAG就是恢复到处理其它事物以前的状态,就像没有出现什么事一样继续做事一样。这样理解子程序:我们写程序时将它的功能分为若干个小的功能来实现这个程序的功能。如:我们编写这样一个程序,输入两个数,求和。第一步。编写是输入子程序第二步。编写求和子程序第三步。编写打印子程序第四步。将三个子程序依次调用(嗯,主程序)这里可以看出为什么调用子程序为什么不保存FLAG标志的原因,子程序之间的联系不大程序不会因为调用了某个子程序就会无法执行下去,当然是有主程序的控制流程。有时候我们还会根据在调用子程序之前与调用子程序之后的FLAG标志来实现某些功能。整个程序就像一个整体由主程序控制着流程,它的FLAG标志是标识它现在的状态。如果(我是说如果)此时有个机制莫名其妙的就改变了它的FLAG就可能使程序无法正常运行,这个机制就像 中断了不保存它的FLAG标志一样。现在能理解它们的它别吗?
只跟你说一下大体思想吧。其他的还是你自己作比较好。
1用指针SI和DI分别指向数据区和存储区首字节,则A2首地址为[SI+LENG],同样SUB1首地址为[DI+LENG]
然后用MOV AX,[SI];MOV BX,AX;ADD AX,[SI+LENG];MOV [DI],AX;MOV AX,BX;
SUB [SI+LENG];MOV [DI+LENG],AX然后指针后移ADD SI,2(如果是字节变量则为1)
2十进制转二进制就是用除2的办法。用DIV指令,对于字变量,商在AX中,余数在DX中。DX中的值只可能为1或0。再用SHR和ROR指令将DX的值移入寄存器BX中,注意所移动的位数。当AX中的值为1或0时,将其移入BX即结束。
显示的话,需将结果每一位转成ASCII码即可。
转八进制只需将转好的二进制从低到高三位一组转成ASCII码即可。还是使用移位指令,每次移三位即可。
以上就是关于汇编 子程序设计全部的内容,包括:汇编 子程序设计、汇编,子程序和内中断的区别、汇编语言(用子程序调用来编程的问题!)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)