本程序的课本排版,并不到位,太多标号,没有缩进,阅读体验呢?而且有些地方有待改进,程序也能正确执行
网上这位大师讲解的很不错。网址是
https://blog.csdn.net/shaco_/article/details/105677400?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242.1
就是咱csdn的文章。
所以我就不讲解书上的代码了。我的代码又做了大的更改:取消了课本charstack 段,由标号getstr直接调用charpush charpop 。代码逻辑如下图:
代码如下,这样程序更简练
assume cs:code,ds:data
data segment
db 200 dup (0);存储字符串的栈段,非系统栈ss:sp,由ds:[bx]指向
data ends
code segment
main:
mov ax,data
mov ds,ax;不给字符栈设置访问偏移量,以后由 标号num给出
mov dh,9
mov dl,2; 设置屏幕上字符串的显示位置
call getstr; 调用输入字符串子程序
mov ax,4c00h
int 21h
getstr: ;该子程序完成从键盘缓冲区取字符,另调用三个子程序
;完成字符串的入栈,出栈和显示
jmp start
num dw 0;更应该理解为栈中字符数目
start:
push ax
push bx
push dx
push es
push di
mov bx,0b800h
mov es,bx
mov al,160
sub ah,ah
mul dh
mov di,ax
add dl,dl
sub dh,dh
add di,dx;设置字符串起始显示位置,es:[di]数值今后将不再改变
readbuff:
mov ah,0
int 16h
cmp al,20h;20h为空格,其前都为不可显示字符
jb notchar
jmp charpush
notchar:
cmp ah,0eh;退格键
je charpop
cmp ah,1ch;enter key
je dealok
charpush:
mov bx,num
mov ds:[bx],al
inc num
jmp charshow
charpop:
cmp num,0
je readbuff
dec num
jmp charshow
charshow:
mov ah,3fh;设置显示字符属性
mov bx,0
push di
showlp:
cmp bx,num
jne noempty
mov al,' '
mov es:[di],ax;空字符
pop di
jmp readbuff
noempty:
mov al,ds:[bx]
mov es:[di],ax
inc bx
add di,2
jmp showlp
dealok:
mov bx,num
mov byte ptr ds:[bx],0;给字符串的末尾加0
pop di
pop es
pop dx
pop bx
pop ax
ret;结束程序,不再接收字符
code ends
end main
测试效果如下:
谢谢阅读