汇编实验10 编写子程序

1.显示字符串
assume cs:codesg
data segment 
	db 'Welcome to masm!',0
data ends
stack segment
	db 16 dup (0)
stack ends

codesg segment
start:		mov dh,0		;行  0~23
		mov dl,0		;列  0~79  可以80,但会到下一行,dl*2<255就行
		mov cl,2		;颜色
		mov ax,data
		mov ds,ax
		mov si,0
		mov di,0
		call show_str
	
back:		mov ax,4c00h
		int 21h

show_str:
		mov ax,stack 
		mov ss,ax
		mov sp,10h	
		call get_row		;计算得出行存在es
		call calc_col   	;计算在显存中真正列的地址
	
	
lpc:		call get_col    	;计算得出列存在di 下一行列在dx
					;列是0 2 4 6....偶数的

		push cx			;保存颜色	
		mov ah,cl		;写入显存的颜色
		mov al,ds:[si]		;写入显存的字
		mov es:[di],ax		;写入显存 
		inc si

		mov ch,0		;内容为0 跳转
		mov cl,ds:[si]		
		jcxz back
		pop cx 			;恢复颜色
		jmp lpc


get_row:
		push cx			;保存颜色
		push dx			;保存行列

		mov ax,0B80ah
		mov dl,dh		;行小于255 用低8位就行
		mov dh,0
		mov cx,dx
		add cx,1		;保证cx>=1
lp1:	add ax,10
		loop lp1
		sub ax,10		;减掉因为cx为0时多加的		
		pop dx			;恢复行列
		pop cx			;恢复颜色
		mov es,ax		;算出行
		ret

get_col:
		push dx			;保存行列 
		mov dh,0
		mov di,dx
		pop ax			;恢复行列到中继寄存器ax
		mov dh,ah		;取原行
		mov dl,al		;取原列
		add dl,2		;列+2	 行列结果存在dx中
		ret

calc_col:
		push dx			;保存行列 
		mov al,dl		;列作为被乘数
		mov dl,2		;*2
		mul dl			;结果不会超过160   因为只有80列
		pop dx			;恢复行
		mov dl,al		;保存真正的列到dl 
		ret

codesg ends

end start

猜你喜欢

转载自blog.csdn.net/duling2/article/details/82962867
今日推荐