21,459
社区成员
发帖
与我相关
我的任务
分享
; 在中间显示以0结尾的字符串
assume cs:code
data segment
db 'welcome to masm!' , 0 ;存放要输出的字符串
data ends
stack segment
db 16 dup (0)
stack ends
code segment
start: mov ax , data ; 设置数据段
mov ds , ax
mov bx, 0
mov ax , stack ; 设置栈段
mov ss , ax
mov sp , 16
mov ax , 0b872h ; 设置要写入的数据位置
mov es , ax ; 写入位置
mov di , 0
mov si , 16 ; 要读取的颜色位置
mov ax , 02H ; 写入颜色,绿色
mov ch , 0
s1: mov cl , ds:[bx] ; 拿出要写入的字符
jcxz ok ; 如果是0,就输出完毕
mov es:[di] , cl ; 把字符写入
mov es:[di + 1] , al ; 写入要颜色
inc bx ; 移动到下一个字符
add di , 2 ; 移动到下一个要写入的位置
loop s1
ok:
mov ax , 4c00h
int 21h
code ends
end start
; 显示以0结束的字符串
assume cs:code
data segment
db 'Dangerous' , 0
data ends
stack segment
db 16 dup(0)
stack ends
code segment
start:
;设置栈
mov ax , stack
mov ss , ax
mov sp , 16
;设置参数
mov dh , 15 ;第16行
mov dl , 32 ;第33列
mov cl , 8ch ;红色+闪烁
;设置要读取的数据位置
mov ax , data
mov ds , ax
mov si , 0
call show_str
mov ax , 4c00h
int 21h
;子程序
;功能:在指定的位置 , 用指定的颜色 , 显示一个用0结束的字符串
;参数:(dh) = 行号(取值范围0~24) , (dl) = 列号(取值范围0~79)
; (cl) = 颜色 , ds:si指向字符串首地址
show_str:
mov ax , 000ah ;转换成行需要乘以a(10)
mul dh ;计算写入位置的行
add ax , 0b800h ;B800是起始位置,所以加上规定的行数
add dl , dl ;计算写入位置的列
mov dh , 0
mov es , ax ;设置写入位置的寄存器
mov di , dx
mov al , cl ;保存颜色
mov cx , 2
jmp first_start
again:
mov cl , ds:[si] ;获取要显示的数据
mov ch , 0 ;不需要高位
jcxz ok ;如果是0则返回(结束这个子程序)
mov es:[di] , cl ;将字符写入
mov es:[di + 1] , al ;写入颜色
add di , 2 ;指向下一个要写入的位置
inc si ;指向下一个要读取字符的位置
mov cl , 2 ;again循环每次都成立
first_start:
loop again
ok: ret ;返回(结束)这个子程序
code ends
end start
; 分别在屏幕上的第2、4、6、8行显示下面的4句英文诗
assume cs:code
code segment
s1: db 'Good,better,best,' , '$'
s2: db 'Never let it rest.' , '$'
s3: db 'Till good is better,' , '$'
s4: db 'And better,bets.' , '$'
s: dw offset s1 , offset s2 , offset s3 , offset s4
row: db 2 , 4 , 6 , 8
start: mov ax , cs
mov ds , ax
mov bx , offset s
mov si , offset row
mov cx , 4
ok: mov bh , 0
mov dh , [ si ]
mov dl , 0
mov ah , 2
int 10h
mov dx , [ bx ]
mov ah , 9
int 21h
inc si
add bx , 2
loop ok
mov ax , 4c00h
int 21h
code ends
end start
assume cs:code
code segment
XOR AX , AX
OR AX , 1000000000B ; 十六进制为0200H
PUSH AX
POP DS ; DS指向0200H位置
MOV AX , 4C00H
INT 21H
code ends
end