小白100000000 发表于 2019-5-20 23:19:14

9号中断

写一个中断程序当松开a键的时候屏幕上全都是a怎么写啊求代码

ba21 发表于 2019-5-20 23:42:48

就课程中的代码可以,必须在纯DOS下运行。CMD下是不可以的
;任务:安装一个新的int 9中断例程
;功能:在DOS下,按'A'键后除非不再松开,如果松开,就显示满屏幕的'A',其他键照常处理
;程序要在纯DOS下运行

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   ;设置ds:si指向源地址
   mov di,204h            ;设置es:di指向目标地址
   mov cx,offset int9end-offset int9    ;设置cx为传输长度
   cld                ;设置传输方向为正
   rep movsb

;将原来的int 9中断例程的入口地址保存在ds:200、ds:202单元中
   push es:
   pop es:
   push es:
   pop es:

;在中断向量表中设置新的int 9中断例程的入口地址
   cli                ;设置IF=0屏蔽中断
   mov word ptr es:,204h
   mov word ptr es:,0
   sti                ;设置IF=1不屏蔽中断

;结束
   mov ax,4c00h
   int 21h

;新的int 9中断例程
int9:push ax
   push bx
   push cx
   push es
   in al,60h ;从端口60h读出键盘输入

;对int指令进行模拟,调用原来的int 9中断例程
   pushf ;标志寄存器入栈
   call dword ptr cs:    ;CS,IP入栈,(IP)=cs:,(CS)=0;cs不一定等于0

;如果是A断码,改变当前屏幕的显示字符
   cmp al,9eh             ;和A的断码(1eh+80h)比较
   jne int9ret            ;不等于A时转移
   mov ax,0b800h
   mov es,ax
   mov bx,0
   mov cx,2000

        s:mov byte ptr es:,41h    ;将A的ASCII码写入,改变字符
   add bx,2
   loop s

int9ret:pop es
   pop cx
   pop bx
   pop ax
   iret

int9end:nop

code ends

end start

小白100000000 发表于 2019-5-21 09:35:15

你怎么把原来的地址放在了es里面不是ds,为什么还要在新的int9号程序上在调用原来的int9号程序,那样cs,和IP的值不就变了么那么它又是怎么执行 后面cmp 的比较呢

peppapig 发表于 2019-5-25 09:41:56

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       

        push es:
        pop es:
        push es:
        pop es:

        cli
        mov word ptr es:,204h
    mov word ptr es:,0
        sti
       
        mov ax,4c00h
        int 21h

int9:       
        push ax
        push bx
        push cx
        push es
      
        in al,60h

        pushf      
      call dword ptr cs:                
        cmp al,9Eh                                               
        jne int9ret

        mov ax,0b800h
        mov es,ax
        mov bx,0
        mov cx,2000
   
s:      mov al,'A'
      mov byte ptr es:, al
      
      ;inc byte ptr es:
        add bx,2
        loop s

int9ret:
        pop es
        pop cx
        pop bx
        pop ax
        iret

int9end:
        nop

code ends

end start
页: [1]
查看完整版本: 9号中断