汇编 子程序设计

汇编 子程序设计,第1张

实验七 子程序设计(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码即可。还是使用移位指令,每次移三位即可。

以上就是关于汇编 子程序设计全部的内容,包括:汇编 子程序设计、汇编,子程序和内中断的区别、汇编语言(用子程序调用来编程的问题!)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10134268.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存