汇编语言实验十-《汇编语言-王爽老师》

10、实验十

1、显示字符串

主要需解决的问题:字符串在显存中的地址定位

代码及注释如下:

;LAB10-1.asm
assume cs:code 
data segment
	db 'Welcome to masm!',0
data ends
 
code segment 
start:		mov dh,10		 ;行
			mov dl,15		 ;列
			mov cl,2		 ;颜色
			mov ax,data 
			mov ds,ax 
			mov si,0
			call show_str
		
			mov ax,4c00h
			int 21h
		
show_str:	push ax 
			push bx
			push es
			push si 
			
			mov ax,0b800h
			mov es,ax
			mov ax,160        ;一行160B
			mul dh            ;计算出(dh)行对应的显存起始地址,结果存放于ax中
			mov bx,ax		  ;bx=ax=160*dh 
			mov ax,2
			mul dl			  ;计算(dl)列对应的显存单元地址,ax=dl*2
			add bx,ax		  ;mov bx, (160*dh + dl*2)设置es:bx指向显存首地址
			mov al,cl 		  ;把颜色cl赋值al
			mov cl,0
 
s0:			mov ch,[si]	      ;待显示的源数据
			jcxz s1		      ;(ds:si)=0时,转到show1执行
			mov es:[bx],ch	  ;显示字符
			mov es:[bx].1,al  ;显示字符颜色
			inc si			  ;ds:si指向下一个字符地址
			add bx,2		  ;es:bx指向下一个显存地址
			jmp s0
			
s1:			pop si
			pop es
			pop bx 
			pop ax
			ret
code ends
end start

运行结果

汇编语言实验十-《汇编语言-王爽老师》_第1张图片

2、解决除法溢出的问题

没看懂

https://blog.csdn.net/Skies_/article/details/122230794

https://blog.csdn.net/shaco_/article/details/105472170

https://blog.csdn.net/qq_60829702/article/details/123582250

3、数值显示

assume cs:code

data segment
        db 10 dup (0)		
data ends

code segment
start:  ;mov ax,317ah		;12666
		mov ax,64h			;100
        mov bx,data
        mov ds,bx
        mov si,0			
        call dtoc

        mov dh,8h			;行号
        mov dl,3h			;列号
        mov cl,2h			;颜色
        call show_str

        mov ax,4c00h
        int 21h

  dtoc: mov bx,0ah			;将16位除数放在bx中,32位/16位
        mov dx,0			;DX为被除数的高16位,低16位为AX
        div bx
        mov cx,ax			;将商赋给cx来判断算法是否结束
        add dx,30h			;DX存放余数+30H正好对应数字的ASCII值
        mov [si],dl			;将所得余数存放在data段中(逆序存放)
        inc si
        jcxz okk			;判断是否结束
        jmp short dtoc		;如果没结束就继续

   okk: ret

show_str:
        sub dh,1h			
        mov al,dh
        mov bl,0a0h        	;一行160B
        mul bl				;bl存放的为显示字符在显存中第一行地址
        mov di,ax
        add di,4h
        mov ax,0b800h
        mov es,ax

        mov ah,cl
    s:  mov cl,-1[si]		;-1[si]=[-1+si],注意汇编语言中不能[si-1]
        mov ch,0

        mov al,cl
        mov es:[di],ax
        sub	si,1
        mov cx,si
        jcxz ok				;以si是否为0来判断是否结束(注意jcxz只能判断cx的值我这里写si是更好理解结束的位置)
        add di,2
        jmp short s

    ok: ret

code ends
end start

你可能感兴趣的:(汇编语言,1024程序员节,汇编语言)