王爽《汇编语言》实验10

1.显示字符串

编写一个通用的子程序,向调用者提供与显存无关的接口,方便调用者在窗口指定位置显示字符串的功能。

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,0b800h		;显存的段地址
		mov es,ax
		mov al,0a0h		;0a0h表示每行的字符数(每行80个字符,每个字符需占用2个字节,
						;其中包含属性字节),用于计算用户指定行的起始地址			
		mul dh			;计算得到指定行偏移地址
		mov di,ax
		mov al,2		;用于计算用户指定行的起始列位置
		mul dl
		add di,ax		;最后得到需要显示字符的具体偏移地址,并赋给di
			
    put:	push cx			;由于在子程序中需要使用cx寄存器,这里保存cx中的值(字体的属性)
		mov cl,ds:[si]	    ;获得需要显示的字符
		mov ch,0
		jcxz ok			;若cx=0,则转到ok处,返回,即表示到达了字符串末尾
		mov es:[di],cl		
		pop cx
		mov es:1[di],cl
		inc si
		add di,2
		jmp short put			
ok:		ret				;子程序返回
code ends
end start

运行结果:

王爽《汇编语言》实验10_第1张图片

2.解决除法溢出的问题

assume cs:code

code segment
	mov ax,4240h
	mov dx,000fh
	mov cx,0ah
	call divdw
	
	mov ax,4c00h
	int 21h
	
;子程序	
divdw:	push bx			;保存主程序中可能使用的寄存器
	push ax			;将ax暂存,用于高16位除法
	mov ax,dx
	mov dx,0
	div cx
	
	mov bx,ax		;将高16位除法所得商暂存bx中
	pop ax			;将ax出栈,用于低16位除法
	div cx
		
	mov cx,dx		;将余数保存在cx中
	mov dx,bx		;将结果的高16位保存在dx中
		
	pop bx			;将子程序开始保存的寄存器还原,以确保主程序的正确
	ret
code ends
end

初始状态:

王爽《汇编语言》实验10_第2张图片

子程序返回前:

 

你可能感兴趣的:(汇编补课,Linux内核学习)