|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
assume cs:code
data segment
db 'Welcome to masm!',0
db 32 dup (0)
data ends
code segment
start: mov dh,8 ;行
mov dl,3 ;列
mov cl,2 ;颜色
mov ax,data
mov ds,ax
mov si,0
mov ax,0b800h
mov es,ax
call chow
mov di,0
mov bx,0
mov cx,100
call yanse
jieshu: mov ax,4c00h
int 21h
chow: mov bx,16
mov ax,0a0H
mov [bx],dh
mov [bx+2],dl
mov [bx+4],cl
mul word ptr ds:[bx]
mov si,ax
mov ax,[bx+2]
mov bx,2
mul bx
add si,ax
ret ;偏移地址
yanse: push cx
mov cl,[bx]
mov ch,0
jcxz jieshu
mov al,[bx]
mov es:[si],al
inc bx
inc si
mov al,[di+20]
mov es:[si],al
inc si
pop cx
loop yanse
ret
code ends
end start
本帖最后由 jackz007 于 2019-7-27 14:44 编辑
你的代码问题很多,我给加了注释,然后修改了有问题的地方,但是,修改量不大,尽量维持了原样,你参考吧。 assume cs:code,ds:data
stack segment stack
dw 0800h dup(0)
stack ends
data segment
msg db 'Welcome to masm!' , 0
buf db 32 dup (0)
data ends
code segment
chow proc near
mov bx,offset buf ; bx指向数据区
mov ax,0a0H ; ax = 160 每行显存的字节数
mov [bx],dh ; 行号 8
mov [bx+2],dl ; 列号 3
mov [bx+4],cl ; 颜色 2
mul word ptr ds:[bx] ; 0a0h * 8
mov si,ax ; si = 0a0h * 8
mov ax,[bx+2] ; ax = 3
mov bx,2 ; bx = 2
mul bx ; ax = 3 * 2
add si,ax ; si = 0a0 * 8 + 3 * 2
ret
chow endp
yanse proc near
mov al,[bx] ; 把待显示字符加载到 al 寄存器
or al,al ; 待显示字符是 0 ?
jz y1 ; 如果是,那就结束显示,准备退出函数
mov es:[si],al ; 把待显示字符储存到显存地址 es : si
inc bx ; 源内存地址指针增 1
inc si ; 显存地址增 1
mov al,[di+04h] ; 加载待显示字符的颜色字节
mov es:[si],al ; 把颜色字节储存到 es : si
inc si ; 显存地址增 1
loop yanse
y1: ret
yanse endp
start proc far
mov dh,8 ; 行
mov dl,3 ; 列
mov cl,2 ; 颜色
mov ax,data
mov ds,ax
mov si,0 ; 初始化目标显存偏移为 0
mov ax,0b800h
mov es,ax
call chow ; 计算第 8 行第 3 列所对应的显存起始偏移,结果保存在 si 中
mov di,offset buf ; ds : di 指向保存有行号、列号以及颜色的内存单元起始地址
mov bx,offset msg ; ds : bx 指向待显示字符串起始地址
mov cx,100 ; 准备循环 100 次,用于显示字符串中的每一个字符
call yanse ; 把从内存地址 ds : bx 开始的所有待显示字符传送到显存 es : si 处,完成信息显示
mov ax,4c00h
int 021h
start endp
code ends
end start
如果让我来写,我会写成下面这个样子,楼主可以参考 assume cs:code,ds:data
stack segment stack
dw 0800h dup(00)
stack ends
data segment para public 'DATA'
msg db 'Welcome to masm!' , 0
db 32 dup (0)
data ends
code segment para public 'CODE'
main proc far
mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov si,offset msg ; si 指向待显示字符串
mov al,7 ; 第 8 行(跨过 7 个满行)
mov cl,0a0h ; 每行显存占据 160 个字节
mul cl
add ax,04h ; 第 3 列(跨过 2 列)
push ax
pop di ; di = 第 8 行第 3 列在显存中的偏移
m1: lodsb ; 从内存 ds : si 加载 1 个字节
or al,al ; 这个字节是 0 值吗?
jz m2 ; 如果是,那就跳走
stosb ; 把加载的字节储存到显存 es : di 处
mov al,02h ; 颜色(绿色)
stosb ; 把字符的颜色属性字节储存到 es : di 处
jmp m1 ; 无条件循环
m2: xor ax,ax ; 等候用户按下任意键
int 016h ; 等候用户按下任意键
mov ax,4c00h ; 结束程序
int 021h ; 结束程序
main endp
code ends
end main
|
|