端口与中断的学习,安装新的int9中断例程
总结:1.外设的输入送入的是端口,端口通过芯片向cpu发生中断请求,当cpu的 (IF)=1时,表示不屏蔽中断请求,这时候就响应了端口的中断,从而执行中断向量表中的ip=(n*4) cs=(n*4+2)的入口 从而执行中断例程.2.执行中断例程的时候要做几个工作(1) 取中断的类型码(2) 标寄存器入栈,IF TF 设置为0 ;避免死循环中断的第一个语句(3)CS IP 入栈(4)执行 (IP) = (n*4) ,CS=(n*4+2) 的入口地址程序由此专区执行中断处理程序3. Cpu对外部的设备通常的处理方法,(1)从外设的输入送入端口(2)向CPU发出中断请求(3)如果IF为1 则 CPU执行完当前指令后响应中断,执行响应的中断例程(4)可在中断例程中实现对外设备输入的相关处理所以:中断 和端口 就是Cpu处理外设进行I/O的基础
assume cs:code,ss:stackstack segmentdb 128 dup (0)stack endscode segmentstart:;设置栈顶mov ax,stackmov ss,axmov sp,128;安装int9中断例程mov ax,csmov ds,axmov si,offset int9;开始地址mov ax,0mov es,axmov di,204H;目的地址mov cx,offset int9end-offset int9;长度cld;正方向rep movsb;保存中断向量表原int9的入口地址push es:[9*4]pop es:[200H];IP保存在0:200Hpush es:[9*4+2]pop es:[202H];CS保存在0:202H;修改中断向量表int9入口地址cli;设置 if为0 屏蔽中断mov word ptr es:[9*4],204H;修改IPmov word ptr es:[9*4+2],0;修改CSsti;设置 if为1 解除屏蔽中断mov cx,120lp: mov ah,0 ;进行120次读取BIOS键盘缓冲区的操作, int 16h ;以辅助读者在程序运行时方便进行相关的按键操作。 loop lpmov ax,4c00hint 21hint9:push axpush espush bxpush cx;保存寄存器中的值in al,60H;读取键盘端口的数据pushfcall dword ptr cs:[200H]cmp al,9EHjne s0;不相等就跳转出mov ax,0B800Hmov es,axmov bx,0mov cx,2000s:mov byte ptr es:[bx],'a'add bx,2loop ss0:pop cx;恢复原寄存器中的值pop bxpop espop axiretint9end:nopcode endsend start