X86汇编语言:从实模式到保护模式(代码+注释)--c9(中断和动态时钟显示)
2023-12-14 18:22:13
中断和动态时钟显示
外部硬件中断
外部设备引起的中断。外部硬件中断是通过两个信号线引入处理器内部的,分别为NMI和INTR。
- 非屏蔽中断(Non Maskable Interrupt, NMI)
事关系统安全的中断,不能被屏蔽需要立刻处理的中断。NMI的输入连接着一个与非门,在不产生中断的情况下,与非门的输入都为高电平,当有产生中断时,有一个输入为0,则与非门的输出为1。
在实模式下,NMI被赋予了统一的中断号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))
- 实模式下的 中断向量表
处理器可以识别256个中断,实模式下,它们的入口点集中存放在内存中,从物理地址0x00000到0x003ff,共1KB的内存空间,每个中断在中断向量表中占4字节,4个字节中低地址2字节为偏移地址,高地址2字节为段地址,这就是中断向量表IVT。
计算机启动时,BIOS完成中断向量表的建立和初始化,为每个中断号填入地址,在哪里只有一条iret指令。 - 实时时钟、CMOS RAM和BCD码
内部中断(系统调用)
- 软中断:由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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!