assume cs:code
stack segment
  db 
128  dup ( 0 )
stack ends

data segment
  dw 
0 , 0
data ends

code segment
start:
  mov ax,stack
  mov ss,ax
  mov sp,
128
  mov ax,data
  mov ds,ax
  mov ax,
0
  mov es,ax
  push es:[
9 * 4 ]
  pop ds:[
0 ]
  push es:[
9 * 4 + 2 ]
  pop ds:[
2 ]
  mov WORD ptr es:[
9 * 4 ],offset int9
  mov es:[
9 * 4 + 2 ],cs
  mov ax,0b800h
  mov es,ax
  mov ah,
' a '
s:
  mov es:[
160 * 12 + 40 * 2 ],ah
  call delay
  inc ah
  cmp ah,
' z '
  jna s
  mov ax,
0
  mov es,ax
  push ds:[
0 ]
  pop es:[
9 * 4 ]
  push ds:[
2 ]
  pop es:[
9 * 4 + 2 ]
  mov ax,4c00h
  
int  21h

delay:
  push ax
  push bx
  mov dx,1000h
  mov ax,
0
s1:
  sub ax,
1
  sbb dx,
0
  cmp ax,
0
  jne s1
  cmp dx,
0
  jne s1
  pop dx
  pop ax
  ret
;
------- 新的int 9中断例程 -------
int9:
  push ax
  push bx
  push es
  
in  al,60h
  pushf
  pushf
  pop bx
  and bh,11111100b
  push bx
  popf
  call DWORD ptr ds:[
0 ]
  cmp al,
1   ;这里的al在哪里改变的呀 ?
  jne int9ret
  mov ax,0b800h
  mov es,ax
  inc BYTE ptr es:[
160 * 12 + 40 * 2 + 1 ]
int9ret:
  pop es
  pop bx
  pop ax
  iret
code ends
end start