(指定された値を10進形式で画面に表示します)WangShuangによるアセンブリ言語実験の第3版10.2

特徴

6つの値が与えられた場合、
一般的な考え方はそれらを10進数で画面に表示することです。まず、画面上の表示が文字(ASCIIコード)の形式であることを知る必要があります。最初に、指定された値を変換する必要があります。キャラクターに1つずつ入れて、画面に表示します

コードセクション

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.レジスタを初期化します

文字列セグメントを設定し、各値を文字に変換して保存します

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を毎回文字列セグメントに格納します。

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レジスタを最初の文字列セグメントにポイントし、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

実行結果

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_46035615/article/details/124158344