提交 90b223e4 创建 作者: 李川's avatar 李川 提交者: 李川

修改中断控制器原理图

上级 0dd78ffa
没有这种文件类型的预览
这个 源代码变更 因为 太大 而不能显示。 你可以 浏览blob 。
没有这种文件类型的预览
这个 源代码变更 因为 太大 而不能显示。 你可以 浏览blob 。
没有这种文件类型的预览
差异被折叠。
没有这种文件类型的预览
这个 源代码变更 因为 太大 而不能显示。 你可以 浏览blob 。
没有这种文件类型的预览
这个 源代码变更 因为 太大 而不能显示。 你可以 浏览blob 。
...@@ -8,45 +8,24 @@ mov sp, 0xf8 ;初始化堆栈指针寄存器 ...@@ -8,45 +8,24 @@ mov sp, 0xf8 ;初始化堆栈指针寄存器
;安装中断向量,安装中断的过程是将各个中断服务程序的入口地址(首地址)保存到对应中断向量指向的存储单元中。 ;安装中断向量,安装中断的过程是将各个中断服务程序的入口地址(首地址)保存到对应中断向量指向的存储单元中。
;中断向量本身是一个地址,它指向一个存储单元,该存储单元保存的就是某个中断服务程序的入口地址(起始地址) ;中断向量本身是一个地址,它指向一个存储单元,该存储单元保存的就是某个中断服务程序的入口地址(起始地址)
;设中断向量列表的首地址为0xf8,即第一个中断向量是存储单元0xf8 ;设中断向量列表的首地址为0xf8,即第一个中断向量是存储单元0xf8
;0号中断向量0xf8,0xf8中保存0号中断服务程序的入口地址
;安装0号中断向量0xf8,0xf8中保存0号中断服务程序的入口地址
lea a, int_0 lea a, int_0
mov r0, 0xf8 mov r0, 0xf8
mov [r0], a mov [r0], a
;1号中断向量0xf9,0xf9中保存1号中断服务程序的入口地址
lea a, int_1
mov r0, 0xf9
mov [r0], a
;2号中断向量0xfa,0xfa中保存2号中断服务程序的入口地址 ;安装3号中断向量0xfb,0xfb中保存3号中断服务程序的入口地址
lea a, int_2
mov r0, 0xfa
mov [r0], a
;3号中断向量0xfb,0xfb中保存3号中断服务程序的入口地址
lea a, int_3 lea a, int_3
mov r0, 0xfb mov r0, 0xfb
mov [r0], a mov [r0], a
;4号中断向量0xfc,0xfc中保存4号中断服务程序的入口地址
lea a, int_4
mov r0, 0xfc
mov [r0], a
;5号中断向量0xfd,0xfd中保存5号中断服务程序的入口地址 ;安装5号中断向量0xfd,0xfd中保存5号中断服务程序的入口地址
lea a, int_5 lea a, int_5
mov r0, 0xfd mov r0, 0xfd
mov [r0], a mov [r0], a
;6号中断向量0xfe,0xfe中保存6号中断服务程序的入口地址
lea a, int_6
mov r0, 0xfe
mov [r0], a
;7号中断向量0xff,0xff中保存7号中断服务程序的入口地址
lea a, int_7
mov r0, 0xff
mov [r0], a
;======================================================= ;=======================================================
;主程序代码 ;主程序代码
...@@ -66,48 +45,21 @@ jmp LOOPC ...@@ -66,48 +45,21 @@ jmp LOOPC
int_0: int_0:
mov a, 0x10 mov a, 0x10
adc a, -1 adc a, -1
ret iret
;1号中断的服务程序
int_1:
mov a, 0x11
sub a, -1
ret
;2号中断的服务程序
int_2:
mov a, 0x12
and a, r0
ret
;3号中断的服务程序 ;3号中断的服务程序
int_3: int_3:
mov a, 0x13 mov a, 0x13
or a, [r0] or a, [r0]
ret sbb a, -1
iret
;4号中断的服务程序
int_4:
mov r1, 2
mov a, 0
adc a, r1
ret
;5号中断的服务程序 ;5号中断的服务程序
int_5: int_5:
mov r2, 3 mov r2, 3
mov a, 1 mov a, 1
and a, r2 and a, r2
ret iret
;6号中断的服务程序
int_6:
mov a, 2
sbb a, 3
ret
;7号中断的服务程序
int_7:
mov a, 2
shl a
ret
\ No newline at end of file
没有这种文件类型的预览
...@@ -8,106 +8,58 @@ ...@@ -8,106 +8,58 @@
0008 ;安装中断向量,安装中断的过程是将各个中断服务程序的入口地址(首地址)保存到对应中断向量指向的存储单元中。 0008 ;安装中断向量,安装中断的过程是将各个中断服务程序的入口地址(首地址)保存到对应中断向量指向的存储单元中。
0009 ;中断向量本身是一个地址,它指向一个存储单元,该存储单元保存的就是某个中断服务程序的入口地址(起始地址) 0009 ;中断向量本身是一个地址,它指向一个存储单元,该存储单元保存的就是某个中断服务程序的入口地址(起始地址)
0010 ;设中断向量列表的首地址为0xf8,即第一个中断向量是存储单元0xf8 0010 ;设中断向量列表的首地址为0xf8,即第一个中断向量是存储单元0xf8
0011 ;0号中断向量0xf8,0xf8中保存0号中断服务程序的入口地址 0011
0012 02 98 31 lea a, int_0 0012 ;安装0号中断向量0xf8,0xf8中保存0号中断服务程序的入口地址
0013 04 8C F8 mov r0, 0xf8 0013 02 98 18 lea a, int_0
0014 06 84 mov [r0], a 0014 04 8C F8 mov r0, 0xf8
0015 0015 06 84 mov [r0], a
0016 ;1号中断向量0xf9,0xf9中保存1号中断服务程序的入口地址 0016
0017 07 98 36 lea a, int_1 0017
0018 09 8C F9 mov r0, 0xf9 0018 ;安装3号中断向量0xfb,0xfb中保存3号中断服务程序的入口地址
0019 0B 84 mov [r0], a 0019 07 98 1D lea a, int_3
0020 0020 09 8C FB mov r0, 0xfb
0021 ;2号中断向量0xfa,0xfa中保存2号中断服务程序的入口地址 0021 0B 84 mov [r0], a
0022 0C 98 3B lea a, int_2 0022
0023 0E 8C FA mov r0, 0xfa 0023
0024 10 84 mov [r0], a 0024 ;安装5号中断向量0xfd,0xfd中保存5号中断服务程序的入口地址
0025 0025 0C 98 23 lea a, int_5
0026 ;3号中断向量0xfb,0xfb中保存3号中断服务程序的入口地址 0026 0E 8C FD mov r0, 0xfd
0027 11 98 3F lea a, int_3 0027 10 84 mov [r0], a
0028 13 8C FB mov r0, 0xfb 0028
0029 15 84 mov [r0], a 0029
0030 0030 ;=======================================================
0031 ;4号中断向量0xfc,0xfc中保存4号中断服务程序的入口地址 0031 ;主程序代码
0032 16 98 43 lea a, int_4 0032
0033 18 8C FC mov r0, 0xfc 0033 11 7C FF mov a, -1
0034 1A 84 mov [r0], a 0034
0035 0035 LOOPC:
0036 ;5号中断向量0xfd,0xfd中保存5号中断服务程序的入口地址 0036 13 8C 01 mov r0, 1
0037 1B 98 49 lea a, int_5 0037 15 10 add a, r0
0038 1D 8C FD mov r0, 0xfd 0038
0039 1F 84 mov [r0], a 0039 16 AC 13 jmp LOOPC
0040 0040
0041 ;6号中断向量0xfe,0xfe中保存6号中断服务程序的入口地址 0041
0042 20 98 4F lea a, int_6 0042 ;=======================================================
0043 22 8C FE mov r0, 0xfe 0043 ;中断服务程序
0044 24 84 mov [r0], a 0044 ;0号中断的服务程序
0045 0045 int_0:
0046 ;7号中断向量0xff,0xff中保存7号中断服务程序的入口地址 0046 18 7C 10 mov a, 0x10
0047 25 98 54 lea a, int_7 0047 1A 2C FF adc a, -1
0048 27 8C FF mov r0, 0xff 0048 1C F8 iret
0049 29 84 mov [r0], a 0049
0050 0050
0051 ;======================================================= 0051 ;3号中断的服务程序
0052 ;主程序代码 0052 int_3:
0053 0053 1D 7C 13 mov a, 0x13
0054 2A 7C FF mov a, -1 0054 1F 64 or a, [r0]
0055 0055 20 4C FF sbb a, -1
0056 LOOPC: 0056 22 F8 iret
0057 2C 8C 01 mov r0, 1 0057
0058 2E 10 add a, r0 0058
0059 0059 ;5号中断的服务程序
0060 2F AC 2C jmp LOOPC 0060 int_5:
0061 0061 23 8E 03 mov r2, 3
0062 0062 25 7C 01 mov a, 1
0063 ;======================================================= 0063 27 52 and a, r2
0064 ;中断服务程序 0064 28 F8 iret
0065 ;0号中断的服务程序 0065
0066 int_0:
0067 31 7C 10 mov a, 0x10
0068 33 2C FF adc a, -1
0069 35 C8 ret
0070
0071 ;1号中断的服务程序
0072 int_1:
0073 36 7C 11 mov a, 0x11
0074 38 3C FF sub a, -1
0075 3A C8 ret
0076
0077 ;2号中断的服务程序
0078 int_2:
0079 3B 7C 12 mov a, 0x12
0080 3D 50 and a, r0
0081 3E C8 ret
0082
0083 ;3号中断的服务程序
0084 int_3:
0085 3F 7C 13 mov a, 0x13
0086 41 64 or a, [r0]
0087 42 C8 ret
0088
0089 ;4号中断的服务程序
0090 int_4:
0091 43 8D 02 mov r1, 2
0092 45 7C 00 mov a, 0
0093 47 21 adc a, r1
0094 48 C8 ret
0095
0096 ;5号中断的服务程序
0097 int_5:
0098 49 8E 03 mov r2, 3
0099 4B 7C 01 mov a, 1
0100 4D 52 and a, r2
0101 4E C8 ret
0102
0103 ;6号中断的服务程序
0104 int_6:
0105 4F 7C 02 mov a, 2
0106 51 4C 03 sbb a, 3
0107 53 C8 ret
0108
0109 ;7号中断的服务程序
0110 int_7:
0111 54 7C 02 mov a, 2
0112 56 D4 shl a
0113 57 C8 ret
\ No newline at end of file
没有这种文件类型的预览
没有这种文件类型的预览
差异被折叠。
...@@ -423,19 +423,16 @@ dup 5, null ...@@ -423,19 +423,16 @@ dup 5, null
dup 16, null dup 16, null
;===================================================================== ;=====================================================================
;硬中断调用返回指令。 ;子程序调用返回指令
;硬中断返回就是出栈过程,将栈顶指针sp指向的存储单元内的返回地址加载到PC,实现中断返回
;与此同时,sp加1,指向新的栈顶
; ret ; ret
path sp, mar ;将栈顶指针SP传入地址寄存器MAR,也就是将中断返回地址传入mar path sp, mar ;将堆栈指针(栈顶地址)传送到 MAR
path sp, cst ;sp传入cst计数器 path sp, cst ;
path sp_inc, cst ;cst计数器加1 path sp_inc, cst ;
path cst, sp ;将cst减1后的结果写入sp,也就是出栈后,sp减1,指向新的栈顶 path cst, sp ;SP = SP + 1,出栈,更新栈顶
path [mar], pc ;将mar寄存器指向存储单元的内容作为地址传入PC,实现中断返回 path [mar], pc ;将调用返回地址加载到PC,转移到调用处的下一条指令继续执行
eoi ;清除已经服务完的硬中断标志
reset upc reset upc
dup 1, null dup 2, null
;===================================================================== ;=====================================================================
; 填充空白指令 ; 填充空白指令
...@@ -523,16 +520,20 @@ reset upc ...@@ -523,16 +520,20 @@ reset upc
dup 6, null dup 6, null
;====================================================================== ;======================================================================
;软中断返回指令 ;中断返回指令
; iret ; iret
path sp, mar ;中断返回就是出栈过程,将栈顶指针sp指向的存储单元内的返回地址加载到PC,实现中断返回
path sp, cst ;与此同时,sp加1,指向新的栈顶
path sp_inc, cst ; iret
path cst, sp path sp, mar ;将栈顶指针SP传入地址寄存器MAR,也就是将中断返回地址传入mar
path [mar], pc path sp, cst ;sp传入cst计数器
path sp_inc, cst ;cst计数器加1
path cst, sp ;将cst减1后的结果写入sp,也就是出栈后,sp减1,指向新的栈顶
path [mar], pc ;将mar寄存器指向存储单元的内容作为地址传入PC,实现中断返回
eoi ;清除已经服务完的硬中断标志
reset upc reset upc
dup 2, null dup 1, null
没有这种文件类型的预览
您添加了 0 人 到此讨论。请谨慎行事。
请先完成此评论的编辑!
请 注册 或者 后发表评论