(将给定的数值以十进制形式显示在屏幕上)王爽汇编语言第三版实验10.2

功能

给定六个数值 要求以十进制显示在屏幕上
大体思路:首先我们要知道显示在屏幕上是以字符的形式(ascii码),我们首先要将给定的数值一位一位的转换成字符存在一个地方,然后再在屏幕上显示出来

代码部分

1.清理屏幕
clear_screen:
		mov dx,0700h	;相当于黑底空字符
		mov cx,2000	;循环次数
		mov bx,0b800h
		mov es,bx
		mov di,0
		
clearscreen:
		mov es:[di],dx
		add di,2
		loop clearscreen

		ret	
2.初始化寄存器

设定string段,将每个数值转换成字符,存在其中

init_reg:
		mov bx,data
		mov ds,bx

		mov bx,string
		mov es,bx
		ret
3.处理数值(外循环)

这个函数的作用就是遍历每个给定的数值

show_number:
		mov bx,0
		mov si,9	;es:[si]
		mov di,160*10+30*2

		mov cx,6

;相当于外循环每次处理一个值
shownumber:			
		call show_word
		add di,160	;代表屏幕中显示的位置每次加一行
		add bx,2	;代表data段中的数据每次换成下一个数据
		loop shownumber

		ret
4.除法求余

将给定数值存在ax寄存器当中,然后先将ax赋值给cx,然后判断cx是否为0,每次将余数dx存放到string段中

short_div:
		mov cx,10	;除数
		div cx
		add dl,30h	;dl是余数
		mov es:[si],dl	;放到我们设定好的字段
		mov cx,ax	;判断是否被除到0
		jcxz short_div_ret
		dec si
		mov dx,0	;重置dx(做除法时dx会被改变)
		jmp short_div

short_div_ret:

		ret
5.初始化显示字符

将ds寄存器指向初始好的string段,将es寄存器指向屏幕的位置

init_reg_show_string:
		mov bx,string
		mov ds,bx

		mov bx,0b800h
		mov es,bx

		ret
6.显示字符串

这时我们si指向的是字符串的最高位,直接输出到值0的位置

show_string:
		push cx
		push ds
		push es
		push si
		push di


		mov cx,0
showstring:
		mov cl,ds:[si]

		jcxz show_string_ret
		mov es:[di],cl
		inc si
		add di,2
		jmp showstring

show_string_ret:

		pop di
		pop si
		pop es
		pop ds
		pop cx

		ret

完整代码

assume cs:code,ds:data,ss:stack

data segment
	dw 1230,12666,1,8,3,38
data ends

string segment		;先将数字放入这个位置
	db 10 dup('0'),0
string ends

stack segment stack
	db 128 dup(0)
stack ends

code segment
	start:
		mov ax,stack
		mov ss,ax
		mov sp,128

		call clear_screen

		call init_reg	;初始化寄存器
	
		call show_number


		mov ax,4c00h
		int 21h
;=============================================
clear_screen:
		mov dx,0700h	;相当于黑底空字符
		mov cx,2000	;循环次数
		mov bx,0b800h
		mov es,bx
		mov di,0
		
clearscreen:
		mov es:[di],dx
		add di,2
		loop clearscreen

		ret		

;=============================================	
show_number:
		mov bx,0
		mov si,9	;es:[si]
		mov di,160*10+30*2

		mov cx,6

;相当于外循环每次处理一个值
shownumber:			
		call show_word
		add di,160	;代表屏幕中显示的位置每次加一行
		add bx,2	;代表data段中的数据每次换成下一个数据
		loop shownumber

		ret
;=============================================
show_word:
		push ax
		push bx
		push cx
		push dx
		push ds
		push es
		push si
		push di		



		mov ax,ds:[bx]	;ax寄存器接收当前值(方便除法)
		mov dx,0

		call short_div	;对当前值做除法取余转换成字符放到指定字段
	
		call init_reg_show_string	;初始化

		call show_string

		pop di
		pop si
		pop es
		pop ds
		pop dx
		pop cx
		pop bx
		pop ax

		ret

;=============================================
show_string:
		push cx
		push ds
		push es
		push si
		push di


		mov cx,0
showstring:
		mov cl,ds:[si]

		jcxz show_string_ret
		mov es:[di],cl
		inc si
		add di,2
		jmp showstring

show_string_ret:

		pop di
		pop si
		pop es
		pop ds
		pop cx

		ret
			


;=============================================
init_reg_show_string:
		mov bx,string
		mov ds,bx

		mov bx,0b800h
		mov es,bx

		ret


;=============================================
short_div:
		mov cx,10	;除数
		div cx
		add dl,30h	;dl是余数
		mov es:[si],dl	;放到我们设定好的字段
		mov cx,ax	;判断是否被除到0
		jcxz short_div_ret
		dec si
		mov dx,0	;重置dx(做除法时dx会被改变)
		jmp short_div

short_div_ret:

		ret
	
;=============================================
init_reg:
		mov bx,data
		mov ds,bx

		mov bx,string
		mov es,bx
		ret




code ends
end start

运行效果

(将给定的数值以十进制形式显示在屏幕上)王爽汇编语言第三版实验10.2_第1张图片

你可能感兴趣的:(安全,系统安全)