程序如下:
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
pop ds
mov ax,0
mov es,ax
mov si,offset int9
mov di,204h
mov cx,offset int9end-offset int9
cld
rep movsb
;将指令复制到0:204h单元
push es:[4*9]
pop es:[200h]
push es:[4*9+2]
pop es:[202h]
;原中断例程入口地址存0:200h
cli
mov word ptr es:[4*9],204h
mov word ptr es:[4*9+2],0
std
;将新的中断例程入口地址写入中断向量表
mov ax,4c00h
int 21h
int9: push ax
push bx
push cx
push es
in al,60h
pushf
call dword ptr cs:[200h]
;调用原中断例程,处理硬件细节
cmp al,1eh
jne int9ret
;如果按键不是A,则中断返回
s: in al,60h
cmp al,9eh
jne s
;若是A,则循环等待按键松开
mov bx,0
mov ax,0b800h
mov es,ax
mov cx,2000
s1: mov byte ptr es:[bx],'A'
add bx,2
loop s1
;显示满屏幕的'A'
int9ret:pop es
pop cx
pop bx
pop ax
iret
int9end:nop
code ends
end start
运行完安装int 9中断例程的程序,如果在cmd命令行模式下按下A键,看不出效果,若进入edit编辑环境,就能够看出效果。另外,P283程序也是这样。在edit环境中按F1,则会出现帮助窗口并且颜色发生改变。
在command命令行模式下安装了新的int 9,就可以直接在命令行中按键并看到效果。
这里把cmd和command的区别总结如下:
command是16位命令行,cmd是32位命令行。
CMD是最常用的命令行环境,提供对系统中所有命令行程序的支持,包括32位PE格式(PE格式,是微软Win32环境可执行文件的标准格式,Portable Executable。)的控制台程序和16位MZ格式的DOS程序;但它本身是一个32位的PE程序,所以在运行16位DOS程序前需要模拟一个环境,那就是“NT下的DOS虚拟机(NT Virtual DOS Machine,简称NTVDM)”,由%SystemRoot%\system32下的ntvdm.exe提供支持。因此,当我们刚刚打开CMD时,进程管理器中会显示出cmd.exe进程,而当在其中运行了一个16位的DOS程序后(比如debug),又会多出一个ntvdm.exe进程。
COMMAND是运行16位DOS程序的兼容性命令行环境,这个环境仍然由ntvdm.exe提供,而COMMAND不再是一个独立的“命令解释器”,而只是一个为了与低版本系统相兼容,而设计出的一个16位命令行环境的入口。所以,在运行COMMAND后,进程管理器只有一个ntvdm.exe进程,而不会有command.com进程。
(以上引用自http://zhidao.baidu.com/question/99866493.html)
- [游客] 感谢 11/15 22:10
- [游客] 把:DD 5937000,改成:DD 4294967295,你的错误,立刻就暴露出来。呵呵 05/19 18:30
- [游客] 计算人均时,是DD型除以DW型。把DD型的最大值代进去,你的程序,就溢出了。 05/19 18:28
- [游客] 注意不溢出的除法。 05/19 18:25
- [游客] 老师好啊~ 06/28 11:01
- [longphui] 谢谢 09/03 20:10
- [longphui] 谢谢 09/03 16:23
- [longphui] 谢谢 09/02 15:26
- [longphui] 谢谢 09/02 09:13
- [sissim] 恩恩,谢谢指正 01/11 18:24
- [even3] 亲,你好。。。这边有一个汇编语言程序,但是就是不知道哪里出了问题,问了很多人,都不知道想麻烦您一下, 05/16 20:48
- [mcjfo] 楼主可以帮我解决这个问题吗?谢谢! 为什么它会跳过JMP DD 指令不执行啊 小弟搞了好久抖没 06/08 06:50