功能
在指定位置用指定的颜色,显示一个用0结束的字符串
在屏幕的8行3列,用绿色显示data段中的内容
代码部分
1.初始化
首先data段中给定指定的字符串并且以0结尾
stack栈段初始为空
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
初始化ss,sp表示栈
mov ax,stack
mov ss,ax
mov sp,128
调用初始化函数,用来初始化ds表示数据段,es表示屏幕中的位置
init_reg:
mov bx,0b800h
mov es,bx
mov bx,data
mov ds,bx
ret
题目要求我们显示在第八行第三列,我们分别写设置行和列的函数
行的函数,每行占160字节所以我们只要将寄存器设置成160*行数,然后再用es+寄存器即可
get_row:
mov al,160
mul dh
ret
列的函数,每个位置占两个字节第一个表示内容,第二个表示颜色,所以这里我们要给列数*2,然后用es+寄存器即可
get_col:
mov al,2
mul dl
ret
2.清理屏幕
题目中没有让清理屏幕,但是这里为了美观我们写一个清理屏幕的函数
直接将dx设置成0700h 07表示空 00表示没有颜色,然后设置循环次数2000次,每次将dx赋值给es:[di]即可,记得要push 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.显示字符串
大体思路:将ds中的内容赋值给cl,然后先判断如果cl为0直接跳出循环,循环中给es:[si]赋值显示内容,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
完整代码
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
效果
汇编真好玩