汇编语言实验报告

发布时间 : 星期三 文章汇编语言实验报告更新完毕开始阅读

实验10 编写子程序

1. 显示字符串:编写一个通用的子程序来实现显示字符串的功能。

子程序描述: 名称:show_str

功能:在指定的位置用指定的颜色,显示一个用0结束的字符串。 参数:(dh)=行号(取值范围0-24), (dl)=列号(取值范围0-79) (cl)=颜色,ds:si指向字符串的首地址 返回:无

如:在屏幕的8行3列,用绿色显示data段中的字符串

assume cs:code data segment

db 'Welcome to masm!',0 data ends

code segment

start:mov dh,8 mov dl,3 mov cl,2 mov ax,data mov ds,ax mov si,0

call show_str

mov ax,4c00h int 21h

show_str: mov ax,160 mul dh mov bx,ax mov ax,2 mul dl add bx,ax mov ax,0B800H mov es,ax mov dl,cl mov cl,0

show0: mov ch,ds:[si] jcxz ok

mov byte ptr es:[bx],ch mov byte ptr es:[bx+1],dl add bx,2 inc si jmp show0 ok: ret code ends end start

2. 解决除法溢出问题:编写子程序避免除法溢出问题

子程序描述: 名称:divdw 功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。

参数:(ax)=dword型数据的低16位,(dx)= dword型数据的高16位,(cx)=除数 返回:(dx)= 结果的高16位,(ax)=结果的低16位, (cx)=余数

应用举例:计算1000000/10(F4240H/0AH),结果:(dx)=0001H,(ax)=86A0H,(cx)=0

assume cs:code code segment

start: mov ax,4240h mov dx,000fh mov cx,0ah call divdw

mov ax,4c00h

int 21h

;名称:divdw

;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。

;参数:(ax)=dword型数据的低16位;(dx)=dword型数据的高16位;(cx)=除数。 ;返回:(dx)=结果的高16位;(ax)=结果的低16位;(cx)=余数。

divdw:

push si push bx push ax mov ax,dx mov dx,0

div cx ;被除数的高位/cx,高位在ax,余数在dx mov si,ax pop ax

div cx ;(被除数高位的商+低位)/cx,高位在ax,余数在dx mov cx,dx ;余数入cx mov dx,si ;高位的商入dx

pop bx pop si ret

code ends end start

公式x/n=int(h/n)*65536+[rem(h/n)*65536+l]/n解析: 把一个会溢出的除法 变成几个除法来做!

如果高位除法有商,那么商就是结果的高位值,如果会有余数,那么余数自然不能丢弃,余数就作为低位除法的dx(也就是高位的被除数,因为他是从高位除法中余下的)

做低位除法的时候,就拿余下的dx+低位数的ax除以除数,会得到 一个低位的商 和 余数 高位的商+低位数的商+余数 就是结果

关键点:不能按照那个公式进行运算,应该在充分理解的基础上写出算法

联系合同范文客服:xxxxx#qq.com(#替换为@)