菜鸟求助各位大神啊一个用光标跟踪字符输入的程序不知道出什么问题了

yuexicheng 2014-04-08 10:34:07

section code align=16 vstart=7c00h
mov ax,cs

mov ss,ax

mov sp,stack_end
start mov ah,0
int 16h;用16号中断读取键盘的输入
mov cl,al
mov ch,ah;用ch存储键盘的通码
call put_string
jmp start

put_string push ax
push bx
;push cx
push dx
push es
push ds
push bp

mov dx,3d4h
mov al,0eh
out dx,al
mov dx,3d5h
in al,dx
mov ah,al;读取光标位置的高8位

mov dx,3d4h
mov al,0fh
out dx,al
mov dx,3d5h
in al,dx;读取光标位置的低8位

mov bx,ax;用bx保存光标位置
mov ax,0b800h
mov es,ax


cmp cl,0dh;判断是否是回车键
je cr_lf
cmp cl,08h;判断是否是backspace键
je backspace
cmp cl,7fh;判断是否是delete键
je next
cmp ch,48h;向上方向键的通码
je lastrow
cmp ch,50h;向下方向键的通码
je nextrow
cmp ch,4bh;向左方向键的通码
je lastone
cmp ch,4dh;向右方向键的通码
je nextone
jmp show_str
show_str shl bx,1
mov [es:bx],cl
mov byte [es:bx+1],07h
shr bx,1
add bx,1
jmp near scroll
nextone add bx,1
jmp near set_cursor
lastone sub bx,1
jmp near set_cursor
nextrow add bx,80
jmp near scroll
lastrow sub bx,80
jmp near set_cursor

next add bx,1
shl bx,1
mov cl,[es:bx]
cmp cl,20h
jne del
shr bx,1
sub bx,1
jmp near set_cursor

del mov word [es:bx],0720h
shr bx,1
jmp near set_cursor


backspace sub bx,1
shl bx,1
mov word [es:bx],0720h
shr bx,1
jmp near set_cursor

cr_lf mov ax,bx
mov bl,80
div bl
mul bl
mov bx,ax
add bx,80
jmp scroll
scroll cmp bx,2000;判断光标是否超过了文字模式下第一页的范围是则向上滚屏一行
jb set_cursor
mov ax,0b800h
mov ds,ax
mov es,ax
mov di,0
mov si,0a0h
mov cx,24*80
rep movsw
mov bp,24*160
mov cx,80
clear mov word [bp],0720h;清除最后一行
loop clear
mov bx,24*80;重置光标于最后一行的行首

set_cursor mov dx,3d4h;重置光标的位置
mov al,0eh
out dx,al
mov dx,3d5h
mov al,bh
out dx,al

mov dx,3d4h
mov al,0fh
out dx,al
mov dx,3d5h
mov al,bl
out dx,al
pop bp
pop ds
pop es
pop dx
;pop cx
pop bx
pop ax
ret

resb 30h
stack_end:

times 510-($-$$) db 0
db 55h,0aah

这段代码是用NASM编译的,然后写入虚拟机硬盘的主引导扇区运行的按照编程的目的是可以用16H号中断取得键盘的输入然后
用光标指示输入的位置将cl中的ASC码在文本模式下显示的可是运行的结果是输入一个字符后就再也无法输入,求各位大神解惑!!
...全文
115 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuexicheng 2014-04-09
  • 打赏
  • 举报
回复
我没有用dosbox用的是virtualbox不用10H中断是为了体验一下接近底层的编程体验,dosbox没试,呃 我现在试一下谢谢啊
zara 2014-04-09
  • 打赏
  • 举报
回复
dosbox 下好像是正常的吗?光标操作上,为什么不用 int10h 中断呢,用端口太麻烦了吧。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧