X86汇编语言:从实模式到保护模式(代码+注释)--c9(中断和动态时钟显示)

2023-12-14 18:22:13

中断和动态时钟显示

外部硬件中断

外部设备引起的中断。外部硬件中断是通过两个信号线引入处理器内部的,分别为NMI和INTR。

  1. 非屏蔽中断(Non Maskable Interrupt, NMI)
    事关系统安全的中断,不能被屏蔽需要立刻处理的中断。NMI的输入连接着一个与非门,在不产生中断的情况下,与非门的输入都为高电平,当有产生中断时,有一个输入为0,则与非门的输出为1。
    在这里插入图片描述
    在实模式下,NMI被赋予了统一的中断号2。
  2. 可屏蔽中断(INTR)
    通过INTR引脚引起。可以处理也可以忽视。
  • 个人计算机中用的最多的中断代理是8259芯片,中断控制器有自己的端口号,使用in或者out进行访问。因此又叫做可编程中断控制器(PIC)。Intel允许256个中断,其中8259负责提供其中的15个,但中断号不固定,该中断控制器有自己的端口号,而可以像访问其他外设一样使用in和out进行访问。
    在8259内部,有一个中断屏蔽寄存器IMR,对应着芯片中的8个输入引脚,每一位0表示允许,1表示阻断。
    主片的端口号为0x20,0x21,从片的端口号为0xa0,0xa1。
    实时时钟连接在8259从片的0号引脚上。
  • 中断能否被处理需要依赖FLAGS中的IF位,该位为0,则INTR引脚的中断信号都会被屏蔽,该位为1则可以响应处理中断(指令:cli(清除IF)和sti(置位IF))
  1. 实模式下的 中断向量表
    处理器可以识别256个中断,实模式下,它们的入口点集中存放在内存中,从物理地址0x00000到0x003ff,共1KB的内存空间,每个中断在中断向量表中占4字节,4个字节中低地址2字节为偏移地址,高地址2字节为段地址,这就是中断向量表IVT。
    计算机启动时,BIOS完成中断向量表的建立和初始化,为每个中断号填入地址,在哪里只有一条iret指令。
  2. 实时时钟、CMOS RAM和BCD码

内部中断(系统调用)

  1. 软中断:由int指令引起的中断处理
int3	;断点中断指令
int imm8	;通常情况下的中断指令
into	;溢出中断指令,检查OF是否为1,如果为1则执行4号中断
  • BIOS中断
    由BIOS建立的中断,个人决定就是程序外部的系统调用,直接用int命令调用就可以实现功能。
         ;代码清单9-2
         ;文件名:c09_2.asm
         ;文件说明:用于演示BIOS中断的用户程序 
         ;创建日期:2012-3-28 20:35
         
;===============================================================================
SECTION header vstart=0                     ;定义用户程序头部段 
    program_length  dd program_end          ;程序总长度[0x00]
    
    ;用户程序入口点
    code_entry      dw start                ;偏移地址[0x04]
                    dd section.code.start   ;段地址[0x06] 
    
    realloc_tbl_len dw (header_end-realloc_begin)/4
                                            ;段重定位表项个数[0x0a]
    
    realloc_begin:
    ;段重定位表           
    code_segment    dd section.code.start   ;[0x0c]
    data_segment    dd section.data.start   ;[0x14]
    stack_segment   dd section.stack.start  ;[0x1c]
    
header_end:                
    
;===============================================================================
SECTION code align=16 vstart=0           ;定义代码段(16字节对齐) 
start:
      mov ax,[stack_segment]
      mov ss,ax
      mov sp,ss_pointer
      mov ax,[data_segment]
      mov ds,ax
      
      mov cx,msg_end-message
      mov bx,message
      
 .putc:
      mov ah,0x0e	;显示字符并将光标推进一个位置
      mov al,[bx]
      int 0x10
      inc bx
      loop .putc

 .reps:
      mov ah,0x00	;从键盘读字符
      int 0x16
      
      mov ah,0x0e	;将读取的字符显示在屏幕上
      mov bl,0x07
      int 0x10

      jmp .reps		;继续执行键盘写入+屏幕显示操作

;===============================================================================
SECTION data align=16 vstart=0

    message       db 'Hello, friend!',0x0d,0x0a
                  db 'This simple procedure used to demonstrate '
                  db 'the BIOS interrupt.',0x0d,0x0a
                  db 'Please press the keys on the keyboard ->'
    msg_end:
                   
;===============================================================================
SECTION stack align=16 vstart=0
           
                 resb 256
ss_pointer:
 
;===============================================================================
SECTION program_trail
program_end:

文章来源:https://blog.csdn.net/weixin_43699371/article/details/134963487
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。