【虎彡】写屏遇见问题了~求助
时间:2010-12-17
来源:互联网
0b800h显存空间0偏移的内容为 YOUR NAME:
输入N个字符后回车(比如输入的是hahaha)就把字符复制到了 屏幕中间 并把YOUR NAME:+字符hahaha的位置覆盖‘ ’空格
然后按Y键把屏幕中间的hahaha又复制回0偏移处 但是YOUR NAME:又出现了 挤到字符串后面 变成
hahahaYOUR NAME: 怎么才能把YOUR NAME真正的清除呢! 我现在想做全屏移动字符的小程序 但在清除旧字符的地方卡住了
求帮助
上源程序:
;*****************************************************************************
data segment
buff db 200,0,200 dup (0)
nam db 'YOUR NAME:$'
one equ 1
count equ 2000
data ends
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
lea dx,nam
mov ah,09h
int 21h ;显示YOUR NAME:
call INPUT_NAME ;调用子程序INPUT_NAME 输入姓名
call xian ;调用子程序在屏幕中间显示字符串
call color ;调用子程序color变色
mov ax,4c00h
int 21h ;看不懂这个你可以果断ALT+F4
;=============================================================================
INPUT_NAME proc near
push ax
push dx
lea dx,buff
mov ah,0ah ;BUFF接收字符可接受200个(包括回车)
int 21h
pop dx
pop ax
ret
INPUT_NAME ENDP
;------------------------------------------------------------------------------
xian proc near
push bx
push cx
push di
push si
mov si,one
mov cl,buff[si]
mov ch,0 ;CX中为输入字符个数
lea bx,buff
add bx,2 ;指向BUFF缓冲区第一个字符
mov di,count ;di指向显存中间
two:
mov al,ds:[bx]
mov es:[di],al ;传送字符
add di,2
inc bx
loop two ;所有存入字符传送到显存中间位置
mov cl,buff[si] ;cl为输入字节数
add cl,0ah ;oah为YOUR NAME:字节数
mov bx,0
qingp:
mov byte ptr es:[bx],' '
add bx,2
loop qingp ;清屏
pop si
pop di
pop cx
pop bx
ret
xian ENDP
;-----------------------------------------------------------------------------
color proc near
push ax
push bx
push cx
xx:
mov bx,one
mov cx,count
sx:
and byte ptr es:[bx],0 ;颜色清除
add bx,2
loop sx
X:
mov ah,0
int 16h ;BIOS中断,读取键盘缓冲区
mov ah,1 ;ah=00000001(蓝色)
cmp al,'i'
jz gaol
cmp al,'s'
jz shan
cmp al,'r'
jz red
cmp al,'g'
jz green
cmp al,'b'
jz blue
cmp al,'l'
je bians
cmp al,'q'
jz over
cmp al,'y'
jne agan
call yidong
agan:
jmp x
shan: mov ah,00010000b ;闪烁
gaol: shl ah,1 ;高亮
red : shl ah,1 ;红
green: shl ah,1 ;绿
blue: mov bx,one ;蓝
mov cx,count
s:
and byte ptr es:[bx],01110000b
or es:[bx],ah ;颜色属性写入所有奇地址
add bx,2
loop s
jmp x ;无条件转到X
bians:
mov cx,2
push cx
mov cl,buff[1]
mov ch,0 ;cx取字符个数
mov bx,count+1 ;BX指向显存中间字符位置
bs:
inc byte ptr es:[bx]
add bx,2
loop bs
pop cx ;变色,死循环
in al,60H ;利用60号键盘端口检测ESC键跳出循环
cmp al,01h ;ESC的扫描码
jz xx
cmp al,99h ;P键暂停
jz x
loop bians
over:
pop cx
pop bx
pop ax
ret
color endp
;-------------------------------------------------------------------
yidong proc near
push ax
push bx
push cx
push dx
push si
push di
call qing
mov dx,0 ;光标起始坐标0
MOV AH,2
mov bh,0
int 10h ;调用int 10h第2号中断,置光标
mov cl,buff[1]
mov si,cx
inc si
inc si
mov byte ptr buff[si],'$'
lea dx,buff
add dx,2
mov ah,9
int 21h
ret
pop di
pop si
pop dx
pop cx
pop bx
pop ax
yidong endp
;--------------------------------------------------------------------
delay proc near
push ax ;空循环(延时)
push dx
mov dx,2000h
mov ax,0
s3: sub ax,1
sbb dx,0
cmp ax,0
jne s3
cmp dx,0
jne s3
pop dx
pop ax
ret
delay endp
;----------------------------------------------------------------------
qing proc near
push cx
push bx
mov cx,count
mov bx,0
kong: mov byte ptr es:[bx],' '
add bx,2
loop kong ;清屏
pop bx
pop cx
ret
qing endp
;-----------------------------------------------------------------------
code ends
end start
;*********************************************************************
输入N个字符后回车(比如输入的是hahaha)就把字符复制到了 屏幕中间 并把YOUR NAME:+字符hahaha的位置覆盖‘ ’空格
然后按Y键把屏幕中间的hahaha又复制回0偏移处 但是YOUR NAME:又出现了 挤到字符串后面 变成
hahahaYOUR NAME: 怎么才能把YOUR NAME真正的清除呢! 我现在想做全屏移动字符的小程序 但在清除旧字符的地方卡住了
求帮助
上源程序:
;*****************************************************************************
data segment
buff db 200,0,200 dup (0)
nam db 'YOUR NAME:$'
one equ 1
count equ 2000
data ends
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
lea dx,nam
mov ah,09h
int 21h ;显示YOUR NAME:
call INPUT_NAME ;调用子程序INPUT_NAME 输入姓名
call xian ;调用子程序在屏幕中间显示字符串
call color ;调用子程序color变色
mov ax,4c00h
int 21h ;看不懂这个你可以果断ALT+F4
;=============================================================================
INPUT_NAME proc near
push ax
push dx
lea dx,buff
mov ah,0ah ;BUFF接收字符可接受200个(包括回车)
int 21h
pop dx
pop ax
ret
INPUT_NAME ENDP
;------------------------------------------------------------------------------
xian proc near
push bx
push cx
push di
push si
mov si,one
mov cl,buff[si]
mov ch,0 ;CX中为输入字符个数
lea bx,buff
add bx,2 ;指向BUFF缓冲区第一个字符
mov di,count ;di指向显存中间
two:
mov al,ds:[bx]
mov es:[di],al ;传送字符
add di,2
inc bx
loop two ;所有存入字符传送到显存中间位置
mov cl,buff[si] ;cl为输入字节数
add cl,0ah ;oah为YOUR NAME:字节数
mov bx,0
qingp:
mov byte ptr es:[bx],' '
add bx,2
loop qingp ;清屏
pop si
pop di
pop cx
pop bx
ret
xian ENDP
;-----------------------------------------------------------------------------
color proc near
push ax
push bx
push cx
xx:
mov bx,one
mov cx,count
sx:
and byte ptr es:[bx],0 ;颜色清除
add bx,2
loop sx
X:
mov ah,0
int 16h ;BIOS中断,读取键盘缓冲区
mov ah,1 ;ah=00000001(蓝色)
cmp al,'i'
jz gaol
cmp al,'s'
jz shan
cmp al,'r'
jz red
cmp al,'g'
jz green
cmp al,'b'
jz blue
cmp al,'l'
je bians
cmp al,'q'
jz over
cmp al,'y'
jne agan
call yidong
agan:
jmp x
shan: mov ah,00010000b ;闪烁
gaol: shl ah,1 ;高亮
red : shl ah,1 ;红
green: shl ah,1 ;绿
blue: mov bx,one ;蓝
mov cx,count
s:
and byte ptr es:[bx],01110000b
or es:[bx],ah ;颜色属性写入所有奇地址
add bx,2
loop s
jmp x ;无条件转到X
bians:
mov cx,2
push cx
mov cl,buff[1]
mov ch,0 ;cx取字符个数
mov bx,count+1 ;BX指向显存中间字符位置
bs:
inc byte ptr es:[bx]
add bx,2
loop bs
pop cx ;变色,死循环
in al,60H ;利用60号键盘端口检测ESC键跳出循环
cmp al,01h ;ESC的扫描码
jz xx
cmp al,99h ;P键暂停
jz x
loop bians
over:
pop cx
pop bx
pop ax
ret
color endp
;-------------------------------------------------------------------
yidong proc near
push ax
push bx
push cx
push dx
push si
push di
call qing
mov dx,0 ;光标起始坐标0
MOV AH,2
mov bh,0
int 10h ;调用int 10h第2号中断,置光标
mov cl,buff[1]
mov si,cx
inc si
inc si
mov byte ptr buff[si],'$'
lea dx,buff
add dx,2
mov ah,9
int 21h
ret
pop di
pop si
pop dx
pop cx
pop bx
pop ax
yidong endp
;--------------------------------------------------------------------
delay proc near
push ax ;空循环(延时)
push dx
mov dx,2000h
mov ax,0
s3: sub ax,1
sbb dx,0
cmp ax,0
jne s3
cmp dx,0
jne s3
pop dx
pop ax
ret
delay endp
;----------------------------------------------------------------------
qing proc near
push cx
push bx
mov cx,count
mov bx,0
kong: mov byte ptr es:[bx],' '
add bx,2
loop kong ;清屏
pop bx
pop cx
ret
qing endp
;-----------------------------------------------------------------------
code ends
end start
;*********************************************************************
作者: znxllyuan 发布时间: 2010-12-17
debug了吗?
作者: masmaster 发布时间: 2010-12-17
引用 1 楼 masmaster 的回复:
debug了吗?
debug了吗?
我到现在连如何跳出循环都不会~
作者: znxllyuan 发布时间: 2010-12-17
引用 2 楼 znxllyuan 的回复:
引用 1 楼 masmaster 的回复:
debug了吗?
我到现在连如何跳出循环都不会~
引用 1 楼 masmaster 的回复:
debug了吗?
我到现在连如何跳出循环都不会~
啊? 王爽的书里有介绍如果使用debug的, 遇到loop/call的可以t可以p,t是单步,p是执行过去,遇到int 21之类的按p, 别的都很简单!
作者: masmaster 发布时间: 2010-12-17
引用 3 楼 masmaster 的回复:
引用 2 楼 znxllyuan 的回复:
引用 1 楼 masmaster 的回复:
debug了吗?
我到现在连如何跳出循环都不会~
啊? 王爽的书里有介绍如果使用debug的, 遇到loop/call的可以t可以p,t是单步,p是执行过去,遇到int 21之类的按p, 别的都很简单!
引用 2 楼 znxllyuan 的回复:
引用 1 楼 masmaster 的回复:
debug了吗?
我到现在连如何跳出循环都不会~
啊? 王爽的书里有介绍如果使用debug的, 遇到loop/call的可以t可以p,t是单步,p是执行过去,遇到int 21之类的按p, 别的都很简单!
恩 回家研究研究
这几天总翻王爽老师的书 后面的章节受益匪浅
作者: znxllyuan 发布时间: 2010-12-17
引用 4 楼 znxllyuan 的回复:
引用 3 楼 masmaster 的回复:
引用 2 楼 znxllyuan 的回复:
引用 1 楼 masmaster 的回复:
debug了吗?
我到现在连如何跳出循环都不会~
啊? 王爽的书里有介绍如果使用debug的, 遇到loop/call的可以t可以p,t是单步,p是执行过去,遇到int 21之类的按p, 别的都很简单!
恩 回家研究研究
这几天总翻王爽老师的……
引用 3 楼 masmaster 的回复:
引用 2 楼 znxllyuan 的回复:
引用 1 楼 masmaster 的回复:
debug了吗?
我到现在连如何跳出循环都不会~
啊? 王爽的书里有介绍如果使用debug的, 遇到loop/call的可以t可以p,t是单步,p是执行过去,遇到int 21之类的按p, 别的都很简单!
恩 回家研究研究
这几天总翻王爽老师的……
学汇编, 不会debug咋成?
作者: masmaster 发布时间: 2010-12-17
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28