;--------------------------------------------------------------------------
;这是Intel汇编语言程序设计这本书第16章的一个例子,它是一个简单的内存驻留程序,作用是阻止按Ctrl-Alt-Delete重启系统.它生成的是.COM程序,安装到内存中,系统只能通过特殊的组合键重启.(Ctrl-Alt-RightShift-Del)
;
;我的问题见程序(MASM6.15+WIN98SE 程序是运行在MS-DOS下):
;--------------------------------------------------------------------------
.model tiny
.code
rt_shift EQU 01h ; Right shift key: bit 0
ctrl_key EQU 04h ; CTRL key: bit 2
alt_key EQU 08h ; ALT key: bit 3
del_key EQU 53h ; scan code for DEL key
kybd_port EQU 60h ; keyboard input port
org 100h ; this is a COM program
start:
jmp setup
msgCtrl BYTE "Ctrl-Alt-Del no run ", 0dh, 0ah, '$ '
; Memory-resident code begins here
int9_handler PROC FAR
sti ; enable hardware interrupts
pushf ; save regs & flags
push es
push ax
push di
;Point ES:DI to the DOS keyboard flag byte:
L1:
mov ax, 40h ; DOS data segment is at 40h
mov es, ax
mov di, 17h ; location of keyboard flag
mov ah, es:[di] ; copy keyboard flag into AH
;Test for the CTRL and ALT keys:
L2:
test ah, ctrl_key ; CTRL key held down?
jz L5 ; no: exit
test ah, alt_key ; ALT key held down?
jz L5 ; no: exit
;Test for the DEL and Right-shift keys:
L3:
in al, kybd_port ; read keyboard port
cmp al, del_key ; DEL key pressed?
jne L5 ; no: exit
test ah, rt_shift ; right shift key pressed?
jnz L5 ; yes: allow system reset
L4: ;-----------------------------------------------------------------
;问题1、我想在这时输出一些提示字符,可是执行后程序输出一堆乱码,然后就死机,按任何键都没用.只能冷启动.(是不是msgCtrl定义的位置不对?).
mov ah, 9
mov dx, OFFSET msgCtrl
int 21h
;-----------------------------------------------------------------
and ah, NOT ctrl_key ; no: turn off bit for CTRL
mov es:[di], ah ; store keyboard_flag
L5:
pop di
pop ax
pop es
popf
jmp cs:[old_interrupt9] ;jump to INT 9 routine
old_interrupt9 DWORD ?