(2011.11.10) 汇编_王爽_第17章_学习小结

  

(2011.11.10) 汇编_王爽_第17章_学习小结

本章内容:

1. int 9 中断例程对键盘输入的处理

2. int 16h 中断例程读取键盘缓冲区

3. 字符串的输入,栈结构的编写

 

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

 

一. int9中断例程对键盘输入的处理

1. 键盘输入:在CPU执行完int 9中断例程以后,都放到了键盘缓冲区中。

2. 键盘缓冲区:有16个字单元,可以存储15个按键的扫描码和对应的ASCII码。

3. 键盘缓冲区:用环形队列的结构管理的内存区。FIFO

4. 缓冲区的字单元中:高位字节存储扫描码,低位字节存储ASCII码。

 

二. int16中断例程读取键盘缓冲区

1. BIOS提供了int16进程,读取一个键盘输入,该功能编号为0,读取完毕后,会将该输入从缓冲区删除。

2. 指令: mov ah, 0 || int 16  || 结果: (ah) = 扫描码, (al) = ASCII码

3. int 16h中断例程的0号功能的工作:

01. 检测键盘缓冲区中是否有数据;

02. 没有则继续做第1步;

03. 读取缓冲区第一个字单元中的键盘输入;

04. 将读取的扫描码送入ah, 将读取的ASCII码送入al;

05. 将已读取的键盘输入从缓冲区中删除。

 

三. 字符串的输入

1. 字符串存储空间:实际上是一个字符栈,字符栈中所有的字符,从栈底到栈顶,组成一个字符串。

2. 应具备的功能:

01.在输入的同时需要显示这个字符串。

02.一般在输入回车符后,字符串输入结束。

03.能够删除已经输入的字符。

3.程序的处理过程:实际上就是一个字符栈。

01.调用int16读取键盘输入

02.如果是字符,则进入字符栈,显示字符栈中的所有字符;继续执行1.

03.如果是退格键,从字符栈中弹出一个字符,显示字符栈中的所有字符:继续执行1.

04.如果是Enter键,向字符栈中压入0,返回。

 

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

; 程序名称:1703_接受字符串输入的子程序.asm
; 程序功能:按照我们平时的输入习惯,程序能显示正在输入的字符,按退格键删除,按回车键确认

; -------------------------------------------------------------------------------------------------------------- the whole program start ---
getstr:
		push ax			; 子程序开始前,先将ax入栈,防止对其它子程序造成影响
						; 程序结束时再将ax出栈。

; ------------------------------------------------------------------------------ statement start ------------------------------------
; 子程序名称:getstrs && nochars
; 子程序功能:接受一个键盘输入并判断该输入属于哪种类型的输入
;                         若为字符,则跳到字符处理的子程序中
;                         若为功能键,则判断是退格键还是Enter键,跳到相应的子程序中
;                         最后循环本子程序
;------------------------------------------------------------- statement end -----

getstrs:
		mov ah, 0			; int16的读取键盘缓冲区的功能编号为0
		int 16h			; 使用int16中断例程
		cmp al, 20h
		jb nochar			; ASCII码小于20h, 说明不是字符,跳到nochar标号中 
		mov ah, 0			
		call charstack		; 字符入栈的调用参数是(ah)=0
		mov ah, 2
		call charstack		; 显示栈中的字符,入栈后显示字符,调用参数(ah)=2
		jmp getstrs		; 循环进入该子程序输入,直至按入回车键退出

nochars:
		cmp ah, 0eh		; 退格键的扫描码
		je backspace
		cmp ah, 1ch		; Enter 键的扫描码
		je enter
		jmp getstrs
; ------------------------------------------------------------------------------------------------------ program end ------------

; ------------------------------------------------------------------------------ statement start ------------------------------------
; 子程序名称:backspace && enter
; 子程序功能:这两个程序分别实现其功能:
;                         输入backspace键时,调用charstack 子程序的(参数为1)的字符出栈
;                         输入enter键时,调用charstack 子程序(参数为0)的字符入栈.
;------------------------------------------------------------- statement end -----
backspace:
		mov ah, 1
		call charstack		; 字符出栈
		mov ah, 2
		call charstack		; 显示栈中的字符
		jmp getstrs

enter:
		mov al, 0
		mov ah, 0
		call charstack		; 0入栈
		mov ah, 2
		call charstack		; 显示栈中的字符
		pop ax
		ret				; 跳出该getstrs子程序
; ------------------------------------------------------------------------------------------------------ program end ------------

; ------------------------------------------------------------------------------ statement start ------------------------------------
; 子程序名称:charstack
; 子程序功能:使用汇编实现栈
;                         先使用一个table作为各功能的数据标号
;                         然后使用一个名为top的数据标号记录元素个数,以实现出入读栈顶的功能
;                         最后再使用各子程序实现功能
;------------------------------------------------------------- statement end -----
charstack:
		jmp short charstart				; 直接跳到charstart标号处,为了不执行非代码段
									; table标号与top标号中的数据

table	dw charpush, charpop, charshow
top		dw 0

charstart:					; 程序开始前,先临时保存需要用到的寄存器
		push bx
		push dx
		push di
		push es
						; 比较ah参数是否0~2正确范围内,若不是,则正常跳出子程序
		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
;---------------------------------------------------------------------------------------------------------------- the whole program end -----


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值