软中断
软中断是一种由软件或程序主动触发的中断。它是一种通过软件调用操作系统提供的服务或功能的机制。在汇编语言中,软中断通常使用特定的指令来触发。在x86架构中,常用的软中断指令是"int"指令。"int"指令后面跟着一个中断向量号,表示要触发的具体中断。当执行"int"指令时,处理器会暂停当前的程序执行,并将控制权转移到操作系统内核中的相应中断处理程序。操作系统根据中断向量号确定要执行的操作,可以是执行特定的系统调用、提供的服务或执行其他操作。
最有名的软中断是BIOS中断,之所以称为BIOS中断,是因为这些中断功能是在计算机加电之后,BIOS程序执行期间建立起来的。
每个外部设备接口,包括各种板卡,如网卡、显卡、键盘接口电路、硬件控制器等,都有自己的只读存储器,类似于BIOS芯片,在这些ROM中有它自己的功能调用例程,以及本设备的初始化代码。按照规范,前两个单元的内容是0x55和0xAA,第三个单元是本ROM中以512字节为单位的代码长度;从第四个单元开始,就是实际的ROM代码。
从内存物理地址A0000开始,到FFFFF结束,有相当一部分空间是留给外围设备的。如果设备存在,那么,它自带的ROM会映射到分配给它的地址范围内。在计算机启动期间,BIOS程序会以2KB为单位搜索内存地址C0000~E0000之间的区域。当它发现某个区域的头2字节是0x55和0xAA时,那意味着该区域有ROM代码存在,是有效的。
接着,它对该区域做累加和检查,看结果是否和第三个单元相符。如果相符,就从第四个单元进入。这时,处理器执行的是硬件自带的程序指令,这些指令初始化外部设备的相关寄存器和工作状态,最后,填写相关的中断向量表,使它们指向自带的中断处理过程。
使用软中断向屏幕输出信息并获取键盘输入
section header vstart=0 align=16
program_length dd program_end
code_entry dw start
dd section.code.start
realloc_tb_len dw (realloc_end - realloc_start) / 4
realloc_start:
code_segment dd section.code.start
data_segment dd section.data.start
stack_segment dd section.stack.start
realloc_end:
section code vstart=0 align=16
start:
mov ss, [stack_segment]
mov sp, stack_pointer
mov ax, [data_segment]
mov ds, ax
mov si, message
mov cx, msg_end
put_info:
mov ah, 0x0e
mov al, [si]
int 0x10
add si, 1
loop put_info
input:
mov ah, 0x00
int 0x16
mov ah, 0x0e
mov bl, 0x07
int 0x10
jmp input
section data vstart=0 align=16
message db 'This simple procedure used to demonstrate '
db 'the BIOS interrupt.',0x0d,0x0a
db 'Please press the keys on the keyboard ->',0x0d,0x0a
msg_end:
section stack vstart=0 align=16
resb 256
stack_pointer:
section trail align=16
program_end:
Comments | NOTHING