|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
assume cs:code
stack segment
db 128 dup(0)
stack ends
;backspace 0Eh Enter 1c
code segment
start:
mov ax,stack
mov ss,ax
mov sp,128
mov ax,0b800h
mov es,ax
s:
mov ah,0
int 16H
cmp al,'0'; 0退出
je s_end
cmp ah,0eh ;删除键
je backspace
cmp ah,1ch
je _Enter ; 回车键
mov ah,0
push ax
call rash ;call 会将地址压入栈中
jmp s
s_end:
mov ax,4c00h
int 21h
;删除键
backspace: ; 这里的删除 最后卡了我一下 随然pop了sp移了 但注意显存里的数据还在
pop bp
mov bp,' ' ;所以要把空格放进去刷新显存
push bp
call rash
pop bp ; 再在栈中删除这个位置
jmp s
;回车键
_Enter:
mov ax,1ch
push ax
jmp s
;刷新显存
rash:
mov cx,sp
mov di,126
mov bh,14 ;行数
mov bl,20;起始位置
mov al,160
mul bh
add al,bl
mov si,ax;显存偏移地址
s0:
cmp di,cx
jna send
mov ax,ss:[di]
cmp al,1ch
jne s1;换行
inc bh ;行数+1
push ax ;保存ax
mov al,160
mul bh ;行数*160
add al,bl; 加起始位置
mov si,ax;放入显存偏移
pop ax ;放回ax
sub di,2 ; 这里要注意 di是要+2的 要过1ch这个回车
jmp s0
s1:
mov byte ptr es:[si],al
mov byte ptr es:[si+1],2
sub di,2
add si,2
jmp s0
jne s0
send:
ret
code ends
end start
自己独立完成 开心开心
可能可读性有点不足 个人觉得还算清晰明了 |
|