提交 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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论