汇编语言-实验10编写子程序

名称:show_str
功能,在指定的位置,用指定的颜色,显示一个用0结束的字符串。
参数:(dh)行号。(dl)列号,(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:
    push dx;
    mov ax,0b800h
    mov es,ax
    mov ah,0
    mov al,dh;al存放行偏移量,用于计算乘法
    mov bx,160
    mul bl
    mov dh,0
    add ax,dx
    add ax,dx;偏移量乘以2才是字节数
    mov bx,ax; bx存放显存偏移地址
    mov si,0; 下标访问数据区
    mov dh,cl; dh 存放显示颜色
    s:
    mov ah,dh
    mov al,ds:[si]
    mov es:[bx],ax
    inc si
    inc bx
    inc bx
    mov ch,0
    mov cl,ds:[si]
    jcxz ok
    loop s
ok :pop dx
    ret
code ends
end start

2.divdw
功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
参数:(ax)=dword型数据的低16位
(bx)=dword型数据的高16位
(cx)除数
提示:给出一个公式
X:被除数,范围:[0,FFFFFFFF]
N:除数,范围[0,FFFF]
H:X高16位,范围:[0,FFFF]
L:X低16位,范围:[0,FFFF]
int()描述性运算符,取商,比如,int(38/10)=3
rem():描述性运算符,取余数,比如,rem(38/10)=8
返回:(dx)=结果高16位,(ax)结果低16位
(cx)余数
公式:X/N=int(H/N)65536+[rem(H/N)65536+L]/N

assume cs:code
	
	code segment
		mov ax,4240h
		mov dx,0fh
		mov cx,0ah
		call divdw
		
		mov ax,4c00h
		int 21h
		
divdw:  push ax
		mov ax,dx  
		mov dx,0  ;被除数的高16位先除,所以将dx置零的原因所在
		
		div cx   ;结果低16位ax存放商,高16位dx存放余数
		mov bx,ax   ;商的高16位放入bx保存,因为题目要求高16位放在dx
		pop ax     ;恢复低16位的被除数,
		div cx    ;结果低16位ax存放商,高16位DX存放余数
		
		mov cx,dx  ;第一次除的结果放在dx中,第二次除默认是放在ax中
		mov dx,bx   ;余数存放在cx
		
		ret
		
	code ends
	end

3.数值显示
编程,将data段中的数据以十进制的形式显示出来
data segment
dw 123,12666,1,8,3,38
data ends

ASCII码:0-9对应于30H-39H
要将数据用十进制的形式显示在屏幕上,要进行两步工作
(1)将用二进制信息存储的数据转变成十进制形式的字符串
(2)显示十进制形式的字符串。(调用show_ptr)
子程序描述:
名称:dtoc
功能:将word型数据转变为表示十进制数的字符串,字符串以0为结束符
参数(ax)=word型数据
ds:si指向字符串的首地址
返回:无

assume cs:code

data segment
 db 10 dup (0)
 data ends
 code segment
 start:mov ax,12666
        mov bx,data
        mov ds,bx
        mov si,0
        call dtoc

        mov dh,8
        mov dl,3
        mov cl,2
        call show_str

    mov ax,4c00h
    int 21h

dtoc: mov dx,0
      mov bx,10  ;bx保存除数10(000a-16位)
      div bx  ;余数在dx中(余数小于除数10,dh一定为0)
              ;商还在ax中
      add dl,30h  ;dl = 十进制数码值 + 30h = 对应的ascii码值
      mov ds:[si],dl  ;data段中数据是逆序存放
      mov cx,ax  ;cx = 商
      jcxz ok  ;商为0则说明各位的数已全部求出
      inc si
      jmp short dtoc
ok:ret
show_str:
    push dx;
    mov ax,0b800h
    mov es,ax
    mov ah,0
    mov al,dh;al存放行偏移量,用于计算乘法
    mov bx,160
    mul bl
    mov dh,0
    add ax,dx
    add ax,dx;偏移量乘以2才是字节数
    mov bx,ax; bx存放显存偏移地址
    mov si,0; 下标访问数据区
    mov dh,cl; dh 存放显示颜色
    s:
    mov ah,dh
    mov al,ds:[si]
    mov es:[bx],ax
    inc si
    inc bx
    inc bx
    mov ch,0
    mov cl,ds:[si]
    jcxz ok1
    loop s
ok1 :pop dx
    ret    
    code ends
    end start
posted @   zhongta  阅读(20)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示