|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
复制代码
|
|