|
主题 : : 分享17.3程序设计,光标位置可以移动,欢迎大家指教! [待解决] |
回复[ 0次 ]
点击[ 347次 ] | |
荣誉值:0
信誉值:0
注册日期:2013-05-02 10:02 |
assume ds:data,cs:code,ss:stack
data segment
db 2000 dup(0) ;用来存放从键盘输入的字符
db 'Please input the string:',0
db 'Warning:The key you press is not a char!Please press again!',0
data ends
stack segment
db 128 dup(0)
stack ends
code segment
start:mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,128
mov dh,0
mov dl,24
mov si,0
mov di,0
mov bx,0b800h
mov es,bx
cursor: mov ah,2 ;调用bios中断的10h号中断的2号功能,设置光标位置
mov bh,0 ;在第0页显示
int 10h
cmp dh,0
jne getstrs
cmp dl,24
je s1
jmp getstrs
s1: mov al,ds:[si+7d0h]
cmp al,0
je getstrs
mov byte ptr es:[di],al
mov byte ptr es:[di+1],00000010b
inc si
add di,2
jmp s1
getstrs: mov si,0
mov ah,0
int 16h
cmp al,20h ;ASCII码小于20h,说明不是字符
jb nochar
mov ah,0
call charstack ;字符入栈
mov ah,2
call charstack ;显示栈中的字符
inc dl ;设置光标位置指向下一个字符
cmp dl,80 ;判断光标位置是否为最后一列
jne cursor
inc dh ;如果光标移到最后一列,则指向下一行
mov dl,0 ;光标位置重新回到新一行第0列
jmp cursor
nochar: cmp ah,0eh ;退格键的扫描码
je backspace
cmp ah,1ch ;Enter键的扫描码
je enter
mov si,25
mov di,12*160+20
s2: mov al,ds:[si+7d0h]
cmp al,0
je getstrs
mov byte ptr es:[di],al
inc byte ptr es:[di+1]
inc si
add di,2
jmp s2
jmp getstrs
backspace: mov ah,1
call charstack ;字符出栈
mov ah,2
call charstack ;显示栈中剩下的字符
cmp dh,0
je next
cmp dl,0
je next1
dec dl
jmp cursor
next1: dec dh
mov dl,79
jmp cursor
next: cmp dl,24
je getstrs
dec dl
cmp dl,24
je t1
jmp cursor
t1:mov ah,2
mov bh,0
int 10h
jmp getstrs
enter: mov ah,0
mov al,0
call charstack ;0入栈
mov al,2
call charstack ;显示栈中的字符
mov ax,4c00h
int 21h
charstack:jmp short charstart
table dw charpush,charpop,charshow
top dw 0
charstart:cmp ah,2
ja sret
mov bl,ah
mov bh,0
add bx,bx
jmp word ptr cs:table[bx]
charpush:mov bx,top
mov ds:[si+bx],al
inc top
jmp sret
charpop:cmp top,0
je sret
dec top
mov bx,top
mov al,ds:[si+bx]
jmp sret
charshow:mov bx,0b800h
mov es,bx
mov di,48
mov bx,0
charshows:cmp bx,top ;此时bx=0,用于判断top是否为0,即栈中字符的个数是否为0
jne noempty
mov byte ptr es:[di],' '
jmp sret
noempty:mov al,ds:[si+bx]
mov es:[di],al
mov byte ptr es:[di+1],00000100b
inc bx
add di,2
jmp charshows
sret:ret
code ends
end start | | |