Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
H
Hardware-IRQ
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
Dream Logic Group
实验项目模板
计算机组成原理
Hardware-IRQ
提交
829a3159
提交
829a3159
12月 14, 2018
创建
作者:
李川
提交者:
李川
12月 14, 2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
修改中断处理和中断返回微程序
上级
985799cf
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
77 行增加
和
47 行删除
+77
-47
Hardware-IRQ.dlsche
Hardware-IRQ.dlsche
+0
-0
Hardware-IRQ.dlsche.svg
Hardware-IRQ.dlsche.svg
+1
-1
rom.dbg
rom.dbg
+0
-0
rom.lst
rom.lst
+47
-32
rom.masm
rom.masm
+27
-12
rom.rxm
rom.rxm
+2
-2
没有找到文件。
Hardware-IRQ.dlsche
浏览文件 @
829a3159
没有这种文件类型的预览
Hardware-IRQ.dlsche.svg
浏览文件 @
829a3159
...
@@ -1235,7 +1235,7 @@
...
@@ -1235,7 +1235,7 @@
<line
stroke=
"#000000"
stroke-linecap=
"round"
stroke-width=
"5"
x1=
"1708"
x2=
"1808"
y1=
"4458"
y2=
"4458"
/>
<line
stroke=
"#000000"
stroke-linecap=
"round"
stroke-width=
"5"
x1=
"1708"
x2=
"1808"
y1=
"4458"
y2=
"4458"
/>
<text
alignment-baseline=
"after-edge"
fill=
"#000080"
font-family=
"微软雅黑"
font-size=
"30"
font-weight=
"700"
text-anchor=
"start"
x=
"164
8"
y=
"4479"
>
0
</text>
<text
alignment-baseline=
"after-edge"
fill=
"#000080"
font-family=
"微软雅黑"
font-size=
"30"
font-weight=
"700"
text-anchor=
"start"
x=
"164
9"
y=
"4478"
>
1
</text>
<rect
fill=
"#ffffff"
fill-opacity=
"0.5"
height=
"60"
stroke=
"#800000"
stroke-width=
"5"
width=
"100"
x=
"1608"
y=
"4428"
/>
<rect
fill=
"#ffffff"
fill-opacity=
"0.5"
height=
"60"
stroke=
"#800000"
stroke-width=
"5"
width=
"100"
x=
"1608"
y=
"4428"
/>
...
...
rom.dbg
浏览文件 @
829a3159
没有这种文件类型的预览
rom.lst
浏览文件 @
829a3159
...
@@ -500,36 +500,51 @@
...
@@ -500,36 +500,51 @@
0500 76C FF FF FF FF dup 5, null
0500 76C FF FF FF FF dup 5, null
0501
0501
0502 ;======================================================================
0502 ;======================================================================
0503 ; 硬中断处理微
指令
程序。
0503 ; 硬中断处理微程序。
0504 ;
硬中断处理就是入栈过程,将下一条指令的地址(中断返回地址)入栈,入栈过程就是将返回地址写入sp加1后指向的存储单元中
0504 ;
硬中断处理完成返回地址入栈,然后加载中断服务程序入口地址到PC的工作。
0505
;然后将硬中断服务程序入口地址加载到PC,转去执行服务程序。
0505
0506
780 EF FF 72 FF path sp, csp ;将堆栈指针寄存器sp的值传送到csp计数器
0506
; 中断返回地址是下一条指令的地址,这是因为当前指令已经执行完毕,是在该指令执行完成后才查询到中断请求的,
0507
784 EF FF FF FF path sp_dec, csp ;计数器csp减1
0507
; 因此,中断返回后应该从当前指令的下一条指令开始执行
0508
788 EF FE F8 FF path csp, sp ;将减计数结果写回sp,完成堆栈指针sp-1操作,为返回地址入栈做准备
0508
0509
78C EF F7 F2 FF path sp, mar ;sp堆栈指针寄存器内容传送到地址寄存器mar
0509
; sp减1,指向新的栈顶,为入栈对象分配一个存储单元。入栈时,栈顶向地址方向生长
0510 7
90 ED FB F3 FF path pc, [mar] ;将返回地址PC入栈
0510 7
80 EF FF 72 FF path sp, csp ;将栈指针寄存器sp的值传送到csp计数器
0511
0511
784 EF FF FF FF path sp_dec, csp ;计数器csp减1
0512
; 根据中断号获取中断服务程序入口地址
0512
788 EF FE F8 FF path csp, sp ;将减计数结果写回sp,完成栈指针sp-1操作,为返回地址入栈做准备
0513
794 EF FF FB FF inta1 ;发出第一个中断应答信号,中断控制器保存最高优先级中断请求对应的编号(0~7)
0513
0514
798 EB FF FC FF inta2 ;发出第二个中断应答信号,将响应中断的终端号读入IA寄存器中,并清除响应的中断请求,避免重复响应
0514
; 中断返回地址入栈
0515
0515
78C EF F7 F2 FF path sp, mar ;sp栈指针寄存器内容传送到地址寄存器mar
0516 79
C EF F7 F1 FF path int_ia, mar ;将中断向量(ia寄存器的内容)传入mar
0516 79
0 ED FB F3 FF path pc, [mar] ;将返回地址PC入栈
0517
7A0 EF EB F9 FF path [mar], pc ;读出中断向量中的内容(中断服务程序首地址),将其加载到PC,执行中断服务程序
0517
0518
7A4 CF FF FF FF reset upc
0518
; 根据中断号获取中断服务程序入口地址
0519
0519
794 EF FF FB FF inta1 ;发出第一个中断应答信号,中断控制器保存最高优先级中断请求对应的编号(0~7)
0520 7
A8 FF FF FF FF dup 6, null
0520 7
98 EB FF FC FF inta2 ;发出第二个中断应答信号,将响应中断的终端号读入IA寄存器中,并清除响应的中断请求,避免重复响应
0521
0521
0522 ;======================================================================
0522 ; 由中断号(中断向量偏移地址)与中断向量基地址0xf8相加得到当前响应的中断向量
0523 ;中断返回指令
0523 79C EF F7 F1 FF path int_ia, mar ;将中断向量(ia寄存器的内容)传入mar
0524 ; iret
0524 7A0 EF EB F9 FF path [mar], pc ;读出中断向量中的内容(中断服务程序入口地址),将其加载到PC,转去执行中断服务程序
0525 ;中断返回就是出栈过程,将栈顶指针sp指向的存储单元内的返回地址加载到PC,实现中断返回
0525 7A4 CF FF FF FF reset upc
0526 ;与此同时,sp加1,指向新的栈顶
0526
0527 ; iret
0527 7A8 FF FF FF FF dup 6, null
0528 7C0 EF F7 F2 FF path sp, mar ;将栈顶指针SP传入地址寄存器MAR,也就是将中断返回地址传入mar
0528
0529 7C4 EF FF 72 FF path sp, csp ;sp传入csp计数器
0529 ;======================================================================
0530 7C8 E7 FF FF FF path sp_inc, csp ;csp计数器加1
0530 ;中断返回指令
0531 7CC EF FE F8 FF path csp, sp ;将csp减1后的结果写入sp,也就是出栈后,sp减1,指向新的栈顶
0531 ; iret
0532 7D0 EF EB F9 FF path [mar], pc ;将mar寄存器指向存储单元的内容作为地址传入PC,实现中断返回
0532 ;中断返回就是出栈过程,将栈顶指针sp指向的存储单元内的返回地址加载到PC,实现中断返回
0533 7D4 EF FF FD FF eoi ;清除已经服务完的硬中断标志
0533 ;与此同时,sp加1,指向新的栈顶
0534 7D8 AF FF FF FF ask_for_int
0534 ; 后进先出
0535 7DC CF FF FF FF reset upc
0535
0536 ; 中断返回地址出栈,将sp指向存储单元保存的返回地址加载到PC中
0537 7C0 EF F7 F2 FF path sp, mar
0538 7C4 EF EB F9 FF path [mar], pc
0539
0540 ; 出栈时,sp加1,栈顶向高地址方向生长
0541 7C8 EF FF 72 FF path sp, csp ;sp传入csp计数器
0542 7CC E7 FF FF FF path sp_inc, csp ;csp计数器加1
0543 7D0 EF FE F8 FF path csp, sp ;将csp加1后的结果写入sp,sp指向新的栈顶
0544
0545 ;发出中断返回命令,清除已经服务完的硬中断标志
0546 7D4 EF FF FD FF eoi
0547
0548 ; 查询中断请求,若存在,则继续响应中断
0549 7D8 AF FF FF FF ask_for_int
0550 7DC CF FF FF FF reset upc
rom.masm
浏览文件 @
829a3159
...
@@ -500,21 +500,28 @@ reset upc
...
@@ -500,21 +500,28 @@ reset upc
dup 5, null
dup 5, null
;======================================================================
;======================================================================
; 硬中断处理微指令程序。
; 硬中断处理微程序。
;硬中断处理就是入栈过程,将下一条指令的地址(中断返回地址)入栈,入栈过程就是将返回地址写入sp加1后指向的存储单元中
; 硬中断处理完成返回地址入栈,然后加载中断服务程序入口地址到PC的工作。
;然后将硬中断服务程序入口地址加载到PC,转去执行服务程序。
path sp, csp ;将堆栈指针寄存器sp的值传送到csp计数器
; 中断返回地址是下一条指令的地址,这是因为当前指令已经执行完毕,是在该指令执行完成后才查询到中断请求的,
; 因此,中断返回后应该从当前指令的下一条指令开始执行
; sp减1,指向新的栈顶,为入栈对象分配一个存储单元。入栈时,栈顶向地址方向生长
path sp, csp ;将栈指针寄存器sp的值传送到csp计数器
path sp_dec, csp ;计数器csp减1
path sp_dec, csp ;计数器csp减1
path csp, sp ;将减计数结果写回sp,完成堆栈指针sp-1操作,为返回地址入栈做准备
path csp, sp ;将减计数结果写回sp,完成栈指针sp-1操作,为返回地址入栈做准备
path sp, mar ;sp堆栈指针寄存器内容传送到地址寄存器mar
; 中断返回地址入栈
path sp, mar ;sp栈指针寄存器内容传送到地址寄存器mar
path pc, [mar] ;将返回地址PC入栈
path pc, [mar] ;将返回地址PC入栈
; 根据中断号获取中断服务程序入口地址
; 根据中断号获取中断服务程序入口地址
inta1 ;发出第一个中断应答信号,中断控制器保存最高优先级中断请求对应的编号(0~7)
inta1 ;发出第一个中断应答信号,中断控制器保存最高优先级中断请求对应的编号(0~7)
inta2 ;发出第二个中断应答信号,将响应中断的终端号读入IA寄存器中,并清除响应的中断请求,避免重复响应
inta2 ;发出第二个中断应答信号,将响应中断的终端号读入IA寄存器中,并清除响应的中断请求,避免重复响应
; 由中断号(中断向量偏移地址)与中断向量基地址0xf8相加得到当前响应的中断向量
path int_ia, mar ;将中断向量(ia寄存器的内容)传入mar
path int_ia, mar ;将中断向量(ia寄存器的内容)传入mar
path [mar], pc ;读出中断向量中的内容(中断服务程序
首地址),将其加载到PC,
执行中断服务程序
path [mar], pc ;读出中断向量中的内容(中断服务程序
入口地址),将其加载到PC,转去
执行中断服务程序
reset upc
reset upc
dup 6, null
dup 6, null
...
@@ -524,12 +531,20 @@ dup 6, null
...
@@ -524,12 +531,20 @@ dup 6, null
; iret
; iret
;中断返回就是出栈过程,将栈顶指针sp指向的存储单元内的返回地址加载到PC,实现中断返回
;中断返回就是出栈过程,将栈顶指针sp指向的存储单元内的返回地址加载到PC,实现中断返回
;与此同时,sp加1,指向新的栈顶
;与此同时,sp加1,指向新的栈顶
; iret
; 后进先出
path sp, mar ;将栈顶指针SP传入地址寄存器MAR,也就是将中断返回地址传入mar
; 中断返回地址出栈,将sp指向存储单元保存的返回地址加载到PC中
path sp, mar
path [mar], pc
; 出栈时,sp加1,栈顶向高地址方向生长
path sp, csp ;sp传入csp计数器
path sp, csp ;sp传入csp计数器
path sp_inc, csp ;csp计数器加1
path sp_inc, csp ;csp计数器加1
path csp, sp ;将csp减1后的结果写入sp,也就是出栈后,sp减1,指向新的栈顶
path csp, sp ;将csp加1后的结果写入sp,sp指向新的栈顶
path [mar], pc ;将mar寄存器指向存储单元的内容作为地址传入PC,实现中断返回
eoi ;清除已经服务完的硬中断标志
;发出中断返回命令,清除已经服务完的硬中断标志
eoi
; 查询中断请求,若存在,则继续响应中断
ask_for_int
ask_for_int
reset upc
reset upc
rom.rxm
浏览文件 @
829a3159
没有这种文件类型的预览
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论