NASM(七)软中断


软中断

软中断是一种由软件或程序主动触发的中断。它是一种通过软件调用操作系统提供的服务或功能的机制。在汇编语言中,软中断通常使用特定的指令来触发。在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:

声明:Hello World|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - NASM(七)软中断


我的朋友,理论是灰色的,而生活之树是常青的!