Caractéristiques
Utiliser la couleur spécifiée à la position spécifiée, afficher une chaîne terminée par 0 et
afficher le contenu de la section de données en vert sur 8 lignes et 3 colonnes de l'écran
section de codes
1. Initialisation
Tout d'abord, la chaîne spécifiée est donnée dans le segment de données et le
segment de pile est initialement vide à la fin de 0.
assume cs:code,ds:data,ss:stack
data segment
db 'Welcome to masm!',0
data ends
stack segment stack
db 128 dup(0)
stack ends
Initialiser ss, sp représente la pile
mov ax,stack
mov ss,ax
mov sp,128
Appelez la fonction d'initialisation pour initialiser ds pour représenter le segment de données et es pour représenter la position dans l'écran
init_reg:
mov bx,0b800h
mov es,bx
mov bx,data
mov ds,bx
ret
Le titre nous oblige à afficher dans la huitième ligne et la troisième colonne, nous écrivons des fonctions pour définir respectivement la ligne et la colonne
Fonction de ligne, chaque ligne occupe 160 octets, il suffit donc de régler le registre sur 160*le nombre de lignes, puis d'utiliser le registre es+
get_row:
mov al,160
mul dh
ret
La fonction de la colonne, chaque position occupe deux octets, le premier représente le contenu, et le second représente la couleur, il faut donc ici donner le nombre de colonnes * 2, puis utiliser le registre es+.
get_col:
mov al,2
mul dl
ret
2. Nettoyez l'écran
Il n'y a pas de nettoyage d'écran dans le titre, mais ici nous écrivons une fonction pour nettoyer l'écran par souci de beauté,
réglez directement dx sur 0700h 07 signifie vide 00 signifie pas de couleur, puis réglez le nombre de cycles sur 2000 fois, et assignez dx à es:[di] à chaque fois Ça y est, pensez à pousser le registre utilisé par la pop
clear_screen:
push bx
push cx
push es
push si
mov bx,0b800h
mov es,bx
mov si,0
mov dx,0700h
mov cx,2000
clearscreen:
mov es:[si],dx
add si,2
loop clearscreen
pop si
pop es
pop cx
pop bx
ret
3. Chaîne d'affichage
L'idée générale : assignez le contenu de ds à cl, puis jugez d'abord que si cl vaut 0, sortez directement de la boucle, assignez le contenu d'affichage à es:[si] dans la boucle, et assignez la couleur à es : [si+1]
show_string:
push ax
push cx
push es
push ds
push di
push si
mov cx,0
showstring:
mov cl,ds:[si]
jcxz show_string_ret ;字符串以0结尾(循环出口)
mov es:[di],cl
mov es:[di+1],dl
add di,2
inc si
jmp showstring
show_string_ret:
pop si
pop di
pop ds
pop es
pop cx
pop ax
ret
code complet
assume cs:code,ds:data,ss:stack
data segment
db 'Welcome to masm!',0
data ends
stack segment stack
db 128 dup(0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,128
call init_reg
mov di,0
mov dh,8
call get_row ;行
add di,ax
mov dl,3
call get_col ;列
add di,ax
call clear_screen ;清理屏幕
mov cl,2
mov dl,cl ;颜色
call show_string ;显示字符串
mov ax,4c00h
int 21h
;================================================
clear_screen:
push bx
push cx
push es
push si
mov bx,0b800h
mov es,bx
mov si,0
mov dx,0700h
mov cx,2000
clearscreen:
mov es:[si],dx
add si,2
loop clearscreen
pop si
pop es
pop cx
pop bx
ret
;================================================
show_string:
push ax
push cx
push es
push ds
push di
push si
mov cx,0
showstring:
mov cl,ds:[si]
jcxz show_string_ret ;字符串以0结尾(循环出口)
mov es:[di],cl
mov es:[di+1],dl
add di,2
inc si
jmp showstring
show_string_ret:
pop si
pop di
pop ds
pop es
pop cx
pop ax
ret
;================================================
get_col:
mov al,2
mul dl
ret
;================================================
get_row:
mov al,160
mul dh
ret
;================================================
init_reg:
mov bx,0b800h
mov es,bx
mov bx,data
mov ds,bx
ret
Effet
La compilation est amusante