麻烦帮忙看下,谢谢

xiexiejohn 2014-04-07 09:31:15
模仿王爽汇编书第294页列程 很奇怪我输入,删除都很正常但再次输入就不显示了,比如说我输入 1 2 3 4 这4个字符,然后删掉3和4再输入5和6 ,这时5和 6不会在3和4位置出现,我跟踪各个寄存器觉的是正常 没有头续,麻烦帮忙,谢谢哈

assume cs:code
code segment
main:
call showchar
mov ax,4c00h
int 21h

showchar: ;子程序 di用于屏幕定位 si用于内存定位
push ax
push es
push di
push si

jmp start
nul db 0,240 dup(0) ;nul[0]用来保存字串长度,num[0+?]处开始保存字符串(长度最多为240)

start:
mov ax,0B800h
mov es,ax
mov di,0
mov si,0
begin: ;这里开始处理用户字串
mov si,0 ;si置0,方便定位
sub di,2 ;把屏幕上显示位置减2,下面加回来方便定位

do:
mov ah,0
int 16h ;执行int16h后ah保存字符扫描码,al保存字符ascii码
cmp al,32 ;ascii码>=32为字符显示,小于为退格和回车
jb nochar ;如果用户输入不是字符即(回车和退格)
cmp nul,240 ;是字符,判断当前字符总数是否小于240
ja exit ;超过退出
inc si ;否则定位nul中要保存字符位置
add di,2 ;定位屏幕上要显示位置
mov nul[si],al ;把字符保存到内存
inc nul ;字符总数+1
mov es:[di],al ;在屏幕上显示输入的字符
jmp do

nochar: ;处理删除键和回车键
cmp al,8 ;退格键?
je backspace ;处理退格键
cmp al,13 ;回车?
je ent ;处理回车键
jmp do ;都不是回到字符输入点

backspace: ;退格键
cmp nul,0 ;在执行退格键前必须判断当前字符串里是否有字符
jna do ;nul<=0(无字符)回到字符输入点
dec nul ;有字符则总数减1
mov nul[si],0 ;把nul[si]位置内容置0(内存中字符删除)
dec si ;修改内存字符串si位置
mov es:[di],0 ;把屏幕上字符删除
sub di,2 ;修改屏幕di位置
jmp do

ent: ;回车
jmp exit

exit:
pop si
pop di
pop es
pop ax
ret
code ends
end main
...全文
143 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zara 2014-04-10
  • 打赏
  • 举报
回复
这个,不改的话,编译也通不过啊
xiexiejohn 2014-04-09
  • 打赏
  • 举报
回复
搞定结贴,原来得把 mov es:[di],0 ;把屏幕上字符删除 这句改成mov byte ptr es:[di],0 才行晕
xiexiejohn 2014-04-09
  • 打赏
  • 举报
回复
up项下自己哈
zara 2014-04-08
  • 打赏
  • 举报
回复
1234两次退格,再56,显示1256,正常啊
xiexiejohn 2014-04-08
  • 打赏
  • 举报
回复
自己顶下,有高手在么
xiexiejohn 2014-04-07
  • 打赏
  • 举报
回复
奇怪删掉位置不能显示字符,多按几下后面倒是可以

21,458

社区成员

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

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