好好欣赏这个程序的逻辑构架,很经典的!!!还有很经典的技巧!
(dh)(dl)=字符串在屏幕上显示的行列位置
assume cs:code
code segment
start: mov dh,12
mov dl,4
call getstr
mov ax,4c00h
int 21h
getstr: push ax
getstrs: mov ah,0 ;用int 16h中断从键盘缓存区取数据
int 16h 扫描码送入ah,ASCII码送入al
cmp al,20h ;ASCII码小于20h,说明不是字符
jb nochar
mov ah,0
call charstack
jmp getstrs
nochar: cmp ah,0eh ;退格键的扫描码
je backspace
cmp ah,1ch ;Enter键的扫描码
je enter
jmp getstrs
backspace: mov ah,1
call charstack
mov ah,2
call charstack
jmp getstrs
enter: mov al,0
mov ah,0
call charstack
mov ah,2
call charstack
pop ax
ret
;子程序:字符栈的入栈、出栈和显示
;参数说明:(ah)=功能号,0表示入栈,1表示出栈,2表示显示;
;ds:si指向字符栈空间
;对于0号功能:(al)=入栈字符
;对于1号功能:(al)=返回的字符
;对于2号功能:(dh)(dl)=字符串在屏幕上显示的行列位置。
charstack:jmp short charstart
table dw charpush,charpop,charshow ;程序入口的直接定址表
top dw 0
charstart: push bx
push dx
push di
push es
cmp ah,2
ja sret
mov bl,ah
mov bh,0
add bx,bx
jmp word ptr table[bx];与表之间的映射关系
charpush: mov bx,top
mov [si][bx],al
inc top
jmp sret
charpop : cmp top,0
je sret
dec top
mov bx,top
mov al,[si][bx]
jmp sret
charshow: mov bx,0b800h
mov es,bx
mov al,160
mov ah,0
mul dh ;计算行
mov di,ax
add dl,dl ;计算列
mov dh,0
add di,dx ;得到在屏幕上的位置
mov bx,0
charshows: cmp bx,top
jne noempty
mov byte ptr es:[di],' '
jmp sret
noempty: mov al,[si][bx]
mov es:[di],al
mov byte ptr es:[di+2],' '
inc bx
add di,2
jmp charshows
sret: pop es
pop di
pop dx
pop bx
ret
code ends
end start
- [游客] 接下来的呢? 07/06 18:01
- [游客] 这个简单。 07/05 18:56
- [游客] 分析的不错,得出的结论也正确,这下子就理解清楚了。 12/18 22:09
- [yugong] 一定要把它搞定!!! 12/11 22:11
- [游客] 再把研究好好研究研究,一定能做出来。 12/11 21:52
- [yugong] younggay,你知道上面3中那个问题吗? 12/10 16:52
- [younggay] 嗯。不错。 12/09 22:09
- [younggay] 大歌们谁能告诉我汇编屏幕分辨率80*25和字体用彩色 -------------- 自己按照《汇 12/09 22:06
- [游客] 用汇编剖析C语言,确实很牛很强大。 12/09 10:24
- [zrwxj3581] 大歌们谁能告诉我汇编屏幕分辨率80*25和字体用彩色 12/09 09:37
- [jcw2008] 元旦快乐! 12/31 23:58
- [jcw2008] Merry Christmas! 12/25 01:17
- [yugong] 字体用彩色请参考实验9的资料! 12/09 20:31
- [zrwxj3581] 大歌们谁能告诉我汇编屏幕分辨率80*25和字体用彩色 12/09 09:35