特徴
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