提交 829a3159 创建 作者: 李川's avatar 李川 提交者: 李川

修改中断处理和中断返回微程序

上级 985799cf
没有这种文件类型的预览
...@@ -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="1648" y="4479">0</text> <text alignment-baseline="after-edge" fill="#000080" font-family="微软雅黑" font-size="30" font-weight="700" text-anchor="start" x="1649" 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"/>
......
没有这种文件类型的预览
...@@ -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 790 ED FB F3 FF path pc, [mar] ;将返回地址PC入栈 0510 780 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 79C EF F7 F1 FF path int_ia, mar ;将中断向量(ia寄存器的内容)传入mar 0516 790 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 7A8 FF FF FF FF dup 6, null 0520 798 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
...@@ -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
没有这种文件类型的预览
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论