+ -
当前位置:首页 → 问答吧 → 【虎彡】写屏遇见问题了~求助

【虎彡】写屏遇见问题了~求助

时间: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  
;*********************************************************************

作者: znxllyuan   发布时间: 2010-12-17

debug了吗?

作者: masmaster   发布时间: 2010-12-17

引用 1 楼 masmaster 的回复:
debug了吗?

 我到现在连如何跳出循环都不会~

作者: znxllyuan   发布时间: 2010-12-17

引用 2 楼 znxllyuan 的回复:
引用 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, 别的都很简单!

  恩 回家研究研究
  这几天总翻王爽老师的书 后面的章节受益匪浅

作者: znxllyuan   发布时间: 2010-12-17

引用 4 楼 znxllyuan 的回复:
引用 3 楼 masmaster 的回复:
引用 2 楼 znxllyuan 的回复:
引用 1 楼 masmaster 的回复:
debug了吗?

我到现在连如何跳出循环都不会~

啊? 王爽的书里有介绍如果使用debug的, 遇到loop/call的可以t可以p,t是单步,p是执行过去,遇到int 21之类的按p, 别的都很简单!

恩 回家研究研究
这几天总翻王爽老师的……

学汇编, 不会debug咋成?

作者: masmaster   发布时间: 2010-12-17