您的位置:首页 > 其它

《汇编语言(第3版)》王爽 第十五章实验

2016-12-26 21:25 323 查看
编写这个程序遇到一些问题:

因为我是在虚拟机XP中运行,但是不知道为什么一改掉原来int9中断的入口,程序就崩溃。一开始以为是程序出错,但是把书中例子和网友的程序试了一下,还是同样的问题。

后来我重新装了MS-DOS,发现问题更加严重,因为这个系统全是命令行操作,只能读取键盘输入,改变原来int9入口地址后,整个键盘就变砖头了,后面的操作也没法进行。

最后我装了一个dosbox,发现可以使用,本程序最终在这个模拟软件上调试成功。

;功能:在DOS下,按下A键后,除非不再松开,如果松开,
;	就满屏幕显示A,其他键照常处理
;思路:按下键后如果是A就不停扫键码,如果扫到A弹起,
;	就满屏显示A
assume cs:code

stack segment
db 128 dup (0)
stack ends

code segment
start:
mov ax,stack	;设置栈
mov ss,ax
mov sp,128

push cs		;相对用ax传值,用栈更简洁
pop ds

mov ax,0
mov es,ax

mov si,offset int9
mov di,204h
mov cx,offset int9end - offset int9
cld
rep movsb

push es:[9*4]	;保存原先int9中断地址到0:200
pop es:[200h]
push es:[9*4+2]
pop es:[202h]

cli		;TF清零,在设地址时屏蔽中断
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0
sti		;TF置1,重新接受可屏蔽中断

mov ax,4c00h
int 21h

int9:
push ax
push bx
push cx
push es

mov ax,0b800h
mov es,ax
mov bx,0
mov cx,25*80

s1:  in al,60h	;从60h端口读数据
;送入原来int9处理得到键值
pushf		;模拟进入中断时状态寄存器保存
call dword ptr cs:[200h]   ;跳转到原来in9中断处理地址

cmp al,1eh	;判断是否为A,
je s1		;如果是A就循环扫键值
cmp al,9eh	;判断是否松开A键
jne s2		;如果已松开就满屏显示A
s3:  mov byte ptr es:[bx],'A'
mov byte ptr es:[bx+1],2
add bx,2
loop s3
s2:
pop es
pop cx
pop bx
pop ax
iret
int9end:  nop
code ends

end start
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: