王爽汇编中断

本文介绍了汇编语言中如何处理中断,包括中断向量表的结构、CPU在中断发生时的操作步骤,以及如何编写中断处理程序。通过不同阶段的示例程序,详细解释了如何设置中断向量和在显存中显示中断信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

中断

中断向量表

共256个表项,每个表项4个字节。共1024个字节。




中断发生时 CPU做了什么事情

 

1) 得到中断的类型号

2) 标志寄存器的值入栈

3) 设置标志寄存器中的TF和IF为0

4) CS的内容、IP的内容入栈(为了中断处理完成后恢复程序的执行)

5) 根据中断的类型号从中断向量表中找到中断处理程序的入口地址

a)      中断向量表中是一个四字节的数,高位表示段地址,地位表示段内偏移地址

b)      设置CS为高地址,IP为低地址的值

(IP)=中断类型码*4                   【字单元】

(CS)=中断类型码*4+2          【字单元】


中断过程中寄存器的入栈顺序是:标志寄存器 、 CS、IP 而iret的出栈顺序是IP、CS、标志寄存器。iret 指令执行后,cpu回到执行中断处理程序前的执行点继续执行程序。



怎样编写中断处理程序

例如:除0中断是0号中断,

1.     中断向量表在内存: 0000:0000~0000:03FF

2.     一般情况下,从0000:0200~0000:02FF的256字节的空间所对应的向量表项是空的。

 

思路:

l  把do0中断处理程序的内容写到0000:0200开始的地址中(不能超过256个字节)怎么写?

l  然后把中断向量表中0号中断的段地址、IP地址设置成0000、0200。这个好办。

l  为了改写中断向量号的段地址、IP地址,就需要知道中断号,除0是0号,中断处理程序怎么知道中断号的?cpu把中断号传给处理程序吗?怎么传?

 

怎么写?

最初始的程序设计

0.0(原始社会)

设计一个do0安装程序

 

assumecs:code

codesegment

start:

设置es:di指向目的地址     ; 0000:0200

设置ds:si指向源地址      ;代码段的地址起始位置

设置cx为传输长度            ;do0程序的字节长度

设置传输的方向为正

rep movsb ;重复传

设置中断向量表

mov ax,4c00H

int 21h

do0:

        显示字符串"overflow!jacob"

        mov ax,4c00h

        int 21h

code ends

end start

 

1) 源地址怎么得到?

a)      段地址code,偏移量:offset do0;

b)      传送的目的地址: 0:200;

c)       传输的长度; do0部分代码的长度

d)      传输的方向: 正向

0.1(奴隶社会)

assume cs:code

code segment

       start:

              movax,cs

              movds,ax

              movsi, offset do0

             

              movax,0

              moves,ax

              movdi,200h

             

              mov cx,do0部分代码的长度

             

              cld

              repmovsb

             

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值