提交 18bbda9a 创建 作者: 李川's avatar 李川 提交者: 李川

修改中断返回指令

上级 760789d3
没有这种文件类型的预览
......@@ -903,251 +903,253 @@
0903 ; 出栈后栈顶指针寄存器sp加1,指向先于标志寄存器入栈的对象
0904 BC0 BF C1 E1 FF path sp, a
0905 BC4 FF D1 E9 D0 path alu_inc, sp
0906 BC8 CB FF FF FF check irq
0907 BCC C3 FF FF FF reset upc
0908
0909 BD0 FF FF FF FF dup 4, null
0906
0907 ; 查询中断请求,若存在,则继续处理中断
0908 BC8 CB FF FF FF check irq
0909 BCC C3 FF FF FF reset upc
0910
0911
0912 ;====================================================================================================
0911 BD0 FF FF FF FF dup 4, null
0912
0913
0914 ;95. sal rd, rs 算术左移指令
0915 BE0 FD FF FF FF inc pc
0916 BE4 FF 47 EF FF path [pc], ir
0917 BE8 FF C1 E3 FF path rs, w
0918 BEC BF C1 E1 FF path rd, a
0919 BF0 FF C9 E8 7F path alu_sal, rd
0920 BF4 FF D3 EB FF path shift_flag, flag
0921 BF8 FD FF FF FF inc pc
0922 BFC CB FF FF FF check irq
0923 C00 C3 FF FF FF reset upc
0924
0925 C04 FF FF FF FF dup 7, null
0914 ;====================================================================================================
0915
0916 ;95. sal rd, rs 算术左移指令
0917 BE0 FD FF FF FF inc pc
0918 BE4 FF 47 EF FF path [pc], ir
0919 BE8 FF C1 E3 FF path rs, w
0920 BEC BF C1 E1 FF path rd, a
0921 BF0 FF C9 E8 7F path alu_sal, rd
0922 BF4 FF D3 EB FF path shift_flag, flag
0923 BF8 FD FF FF FF inc pc
0924 BFC CB FF FF FF check irq
0925 C00 C3 FF FF FF reset upc
0926
0927
0928 ;===========================================================================
0929 ;97. sar rd, rs 算术右移指令
0930 C20 FD FF FF FF inc pc
0931 C24 FF 47 EF FF path [pc], ir
0932 C28 FF C1 E3 FF path rs, w
0933 C2C BF C1 E1 FF path rd, a
0934 C30 FF C9 E9 7F path alu_sar, rd
0935 C34 FF D3 EB FF path shift_flag, flag
0936 C38 FD FF FF FF inc pc
0937 C3C CB FF FF FF check irq
0938 C40 C3 FF FF FF reset upc
0939
0940 C44 FF FF FF FF dup 7, null
0927 C04 FF FF FF FF dup 7, null
0928
0929
0930 ;===========================================================================
0931 ;97. sar rd, rs 算术右移指令
0932 C20 FD FF FF FF inc pc
0933 C24 FF 47 EF FF path [pc], ir
0934 C28 FF C1 E3 FF path rs, w
0935 C2C BF C1 E1 FF path rd, a
0936 C30 FF C9 E9 7F path alu_sar, rd
0937 C34 FF D3 EB FF path shift_flag, flag
0938 C38 FD FF FF FF inc pc
0939 C3C CB FF FF FF check irq
0940 C40 C3 FF FF FF reset upc
0941
0942
0943 ;===========================================================================
0944 ;99. shl rd, rs 逻辑左移指令
0945 C60 FD FF FF FF inc pc
0946 C64 FF 47 EF FF path [pc], ir
0947 C68 FF C1 E3 FF path rs, w
0948 C6C BF C1 E1 FF path rd, a
0949 C70 FF C9 E8 3F path alu_shl, rd
0950 C74 FF D3 EB FF path shift_flag, flag
0951 C78 FD FF FF FF inc pc
0952 C7C CB FF FF FF check irq
0953 C80 C3 FF FF FF reset upc
0954
0955 C84 FF FF FF FF dup 7, null
0942 C44 FF FF FF FF dup 7, null
0943
0944
0945 ;===========================================================================
0946 ;99. shl rd, rs 逻辑左移指令
0947 C60 FD FF FF FF inc pc
0948 C64 FF 47 EF FF path [pc], ir
0949 C68 FF C1 E3 FF path rs, w
0950 C6C BF C1 E1 FF path rd, a
0951 C70 FF C9 E8 3F path alu_shl, rd
0952 C74 FF D3 EB FF path shift_flag, flag
0953 C78 FD FF FF FF inc pc
0954 C7C CB FF FF FF check irq
0955 C80 C3 FF FF FF reset upc
0956
0957
0958 ;===========================================================================
0959 ;101. shr rd, rs 逻辑右移指令
0960 CA0 FD FF FF FF inc pc
0961 CA4 FF 47 EF FF path [pc], ir
0962 CA8 FF C1 E3 FF path rs, w
0963 CAC BF C1 E1 FF path rd, a
0964 CB0 FF C9 E9 3F path alu_shr, rd
0965 CB4 FF D3 EB FF path shift_flag, flag
0966 CB8 FD FF FF FF inc pc
0967 CBC CB FF FF FF check irq
0968 CC0 C3 FF FF FF reset upc
0969
0970 CC4 FF FF FF FF dup 7, null
0957 C84 FF FF FF FF dup 7, null
0958
0959
0960 ;===========================================================================
0961 ;101. shr rd, rs 逻辑右移指令
0962 CA0 FD FF FF FF inc pc
0963 CA4 FF 47 EF FF path [pc], ir
0964 CA8 FF C1 E3 FF path rs, w
0965 CAC BF C1 E1 FF path rd, a
0966 CB0 FF C9 E9 3F path alu_shr, rd
0967 CB4 FF D3 EB FF path shift_flag, flag
0968 CB8 FD FF FF FF inc pc
0969 CBC CB FF FF FF check irq
0970 CC0 C3 FF FF FF reset upc
0971
0972
0973 ;===========================================================================
0974 ;103. rol rd, rs 不带进位的循环左移指令
0975 CE0 FD FF FF FF inc pc
0976 CE4 FF 47 EF FF path [pc], ir
0977 CE8 FF C1 E3 FF path rs, w
0978 CEC BF C1 E1 FF path rd, a
0979 CF0 FF C9 E8 BF path alu_rol, rd
0980 CF4 FF D3 EB FF path shift_flag, flag
0981 CF8 FD FF FF FF inc pc
0982 CFC CB FF FF FF check irq
0983 D00 C3 FF FF FF reset upc
0984
0985 D04 FF FF FF FF dup 7, null
0972 CC4 FF FF FF FF dup 7, null
0973
0974
0975 ;===========================================================================
0976 ;103. rol rd, rs 不带进位的循环左移指令
0977 CE0 FD FF FF FF inc pc
0978 CE4 FF 47 EF FF path [pc], ir
0979 CE8 FF C1 E3 FF path rs, w
0980 CEC BF C1 E1 FF path rd, a
0981 CF0 FF C9 E8 BF path alu_rol, rd
0982 CF4 FF D3 EB FF path shift_flag, flag
0983 CF8 FD FF FF FF inc pc
0984 CFC CB FF FF FF check irq
0985 D00 C3 FF FF FF reset upc
0986
0987
0988 ;===========================================================================
0989 ;105. ror rd, rs 不带进位的循环右移指令
0990 D20 FD FF FF FF inc pc
0991 D24 FF 47 EF FF path [pc], ir
0992 D28 FF C1 E3 FF path rs, w
0993 D2C BF C1 E1 FF path rd, a
0994 D30 FF C9 E9 BF path alu_ror, rd
0995 D34 FF D3 EB FF path shift_flag, flag
0996 D38 FD FF FF FF inc pc
0997 D3C CB FF FF FF check irq
0998 D40 C3 FF FF FF reset upc
0999
1000 D44 FF FF FF FF dup 7, null
0987 D04 FF FF FF FF dup 7, null
0988
0989
0990 ;===========================================================================
0991 ;105. ror rd, rs 不带进位的循环右移指令
0992 D20 FD FF FF FF inc pc
0993 D24 FF 47 EF FF path [pc], ir
0994 D28 FF C1 E3 FF path rs, w
0995 D2C BF C1 E1 FF path rd, a
0996 D30 FF C9 E9 BF path alu_ror, rd
0997 D34 FF D3 EB FF path shift_flag, flag
0998 D38 FD FF FF FF inc pc
0999 D3C CB FF FF FF check irq
1000 D40 C3 FF FF FF reset upc
1001
1002
1003 ;===========================================================================
1004 ;107. rcl rd, rs 带进位的循环左移指令
1005 D60 FD FF FF FF inc pc
1006 D64 FF 47 EF FF path [pc], ir
1007 D68 FF C1 E3 FF path rs, w
1008 D6C BF C1 E1 FF path rd, a
1009 D70 FF C9 E8 FF path alu_rcl, rd
1010 D74 FF D3 EB FF path shift_flag, flag
1011 D78 FD FF FF FF inc pc
1012 D7C CB FF FF FF check irq
1013 D80 C3 FF FF FF reset upc
1014
1015 D84 FF FF FF FF dup 7, null
1002 D44 FF FF FF FF dup 7, null
1003
1004
1005 ;===========================================================================
1006 ;107. rcl rd, rs 带进位的循环左移指令
1007 D60 FD FF FF FF inc pc
1008 D64 FF 47 EF FF path [pc], ir
1009 D68 FF C1 E3 FF path rs, w
1010 D6C BF C1 E1 FF path rd, a
1011 D70 FF C9 E8 FF path alu_rcl, rd
1012 D74 FF D3 EB FF path shift_flag, flag
1013 D78 FD FF FF FF inc pc
1014 D7C CB FF FF FF check irq
1015 D80 C3 FF FF FF reset upc
1016
1017
1018 ;===========================================================================
1019 ;109. rcr rd, rs 带进位的循环右移指令
1020 DA0 FD FF FF FF inc pc
1021 DA4 FF 47 EF FF path [pc], ir
1022 DA8 FF C1 E3 FF path rs, w
1023 DAC BF C1 E1 FF path rd, a
1024 DB0 FF C9 E9 FF path alu_rcr, rd
1025 DB4 FF D3 EB FF path shift_flag, flag
1026 DB8 FD FF FF FF inc pc
1027 DBC CB FF FF FF check irq
1028 DC0 C3 FF FF FF reset upc
1029
1030 DC4 FF FF FF FF dup 7, null
1017 D84 FF FF FF FF dup 7, null
1018
1019
1020 ;===========================================================================
1021 ;109. rcr rd, rs 带进位的循环右移指令
1022 DA0 FD FF FF FF inc pc
1023 DA4 FF 47 EF FF path [pc], ir
1024 DA8 FF C1 E3 FF path rs, w
1025 DAC BF C1 E1 FF path rd, a
1026 DB0 FF C9 E9 FF path alu_rcr, rd
1027 DB4 FF D3 EB FF path shift_flag, flag
1028 DB8 FD FF FF FF inc pc
1029 DBC CB FF FF FF check irq
1030 DC0 C3 FF FF FF reset upc
1031
1032 ;===========================================================================
1033 ;111. nop 空指令
1034 DE0 FD FF FF FF inc pc
1035 DE4 C3 FF FF FF reset upc
1036
1037 DE8 FF FF FF FF dup 6, null
1032 DC4 FF FF FF FF dup 7, null
1033
1034 ;===========================================================================
1035 ;111. nop 空指令
1036 DE0 FD FF FF FF inc pc
1037 DE4 C3 FF FF FF reset upc
1038
1039 ;===========================================================================
1040 ;112. hlt 停机
1041 E00 C3 FF FF FF reset upc
1042 E04 FF FF FF FF dup 7, null
1043
1044
1045 ;===========================================================================
1046 ;113. call symbol
1047 ; 更新栈顶
1048 E20 BF C1 E1 FF path sp, a
1049 E24 BF C1 E3 FF path sp, w
1050 E28 FF D1 E9 DF path alu_dec, sp ; sp = sp - 1
1051 E2C BF C1 E5 FF path sp, mar ; 将sp转移到mar中,为返回地址入栈做准备
1052
1053 ; 读出标号指定的跳转地址并暂存到寄存器a中
1054 E30 FD FF FF FF inc pc
1055 E34 FF 47 E1 FF path [pc], a
1056
1057 ; 将下一条指令地址(中断返回地址)入栈
1058 E38 FD FF FF FF inc pc
1059 E3C FF 85 E7 FF path pc, [mar]
1060
1061 ; 将a中暂存的跳转地址置入pc,实现子程序调用
1062 E40 FF D0 FF FF path a, pc
1063 E44 CB FF FF FF check irq
1064 E48 C3 FF FF FF reset upc
1065
1066 E4C FF FF FF FF dup 5, null
1039 DE8 FF FF FF FF dup 6, null
1040
1041 ;===========================================================================
1042 ;112. hlt 停机
1043 E00 C3 FF FF FF reset upc
1044 E04 FF FF FF FF dup 7, null
1045
1046
1047 ;===========================================================================
1048 ;113. call symbol
1049 ; 更新栈顶
1050 E20 BF C1 E1 FF path sp, a
1051 E24 BF C1 E3 FF path sp, w
1052 E28 FF D1 E9 DF path alu_dec, sp ; sp = sp - 1
1053 E2C BF C1 E5 FF path sp, mar ; 将sp转移到mar中,为返回地址入栈做准备
1054
1055 ; 读出标号指定的跳转地址并暂存到寄存器a中
1056 E30 FD FF FF FF inc pc
1057 E34 FF 47 E1 FF path [pc], a
1058
1059 ; 将下一条指令地址(中断返回地址)入栈
1060 E38 FD FF FF FF inc pc
1061 E3C FF 85 E7 FF path pc, [mar]
1062
1063 ; 将a中暂存的跳转地址置入pc,实现子程序调用
1064 E40 FF D0 FF FF path a, pc
1065 E44 CB FF FF FF check irq
1066 E48 C3 FF FF FF reset upc
1067
1068 ;===========================================================================
1069 ;115. ret 子程序调用返回指令
1070 E60 BF C1 E5 FF path sp, mar
1071 E64 FF 86 FF FF path [mar], pc ; 首先读出栈指针sp指向存储单元的内容,即返回地址,
1072 ; 将其加载到PC中,实现调用返回
1073
1074 E68 BF C1 E1 FF path sp, a
1075 E6C FF D1 E9 D0 path alu_inc, sp ; 然后将sp加1,sp指向新的栈顶,即出栈
1076 ; 出栈时,栈顶向高地址空间生长
1077 E70 C3 FF FF FF reset upc
1078
1079 E74 FF FF FF FF dup 3, null
1068 E4C FF FF FF FF dup 5, null
1069
1070 ;===========================================================================
1071 ;115. ret 子程序调用返回指令
1072 E60 BF C1 E5 FF path sp, mar
1073 E64 FF 86 FF FF path [mar], pc ; 首先读出栈指针sp指向存储单元的内容,即返回地址,
1074 ; 将其加载到PC中,实现调用返回
1075
1076 E68 BF C1 E1 FF path sp, a
1077 E6C FF D1 E9 D0 path alu_inc, sp ; 然后将sp加1,sp指向新的栈顶,即出栈
1078 ; 出栈时,栈顶向高地址空间生长
1079 E70 C3 FF FF FF reset upc
1080
1081
1082 ;===========================================================================
1083 ;116. cli 关中断指令
1084 E80 D3 FF FF FF cli ; 清零中断标志允许位IF=0,禁止硬中断请求
1085 E84 FD FF FF FF inc pc
1086 E88 C3 FF FF FF reset upc
1087
1088 E8C FF FF FF FF dup 5, null
1081 E74 FF FF FF FF dup 3, null
1082
1083
1084 ;===========================================================================
1085 ;116. cli 关中断指令
1086 E80 D3 FF FF FF cli ; 清零中断标志允许位IF=0,禁止硬中断请求
1087 E84 FD FF FF FF inc pc
1088 E88 C3 FF FF FF reset upc
1089
1090 ;===========================================================================
1091 ;117. sti 开中断指令
1092 EA0 D7 FF FF FF sti ; 设置中断允许标志位IF=1,允许硬中断请求
1093 EA4 FD FF FF FF inc pc
1094 EA8 C3 FF FF FF reset upc
1095
1096 EAC FF FF FF FF dup 5, null
1090 E8C FF FF FF FF dup 5, null
1091
1092 ;===========================================================================
1093 ;117. sti 开中断指令
1094 EA0 D7 FF FF FF sti ; 设置中断允许标志位IF=1,允许硬中断请求
1095 EA4 FD FF FF FF inc pc
1096 EA8 C3 FF FF FF reset upc
1097
1098
1099 ;===========================================================================
1100 ;118. 硬中断处理微指令程序
1101 ; 标志寄存器和断点地址入栈
1102 EC0 BF C1 E1 FF path sp, a
1103 EC4 BF C1 E3 FF path sp, w
1104 EC8 FF D1 E9 DF path alu_dec, sp ; sp减1,指向新的栈顶,为标志寄存器入栈做准备
1105 ECC BF C1 E5 FF path sp, mar
1106 ED0 FF 83 E7 FF path flag, [mar] ; 将标志寄存器入栈,入栈时,栈向低地址空间生长
1107 ED4 BF C1 E1 FF path sp, a
1108 ED8 FF D1 E9 DF path alu_dec, sp ; sp减1,为返回地址入栈做准备
1109 EDC BF C1 E5 FF path sp, mar
1110 EE0 FF 85 E7 FF path pc, [mar] ; 当前PC指向下一条指令,正是返回地址,将其入栈
1111
1112
1113 ; 从8259读取中断号,依据中断号得到对应中断向量
1114 EE4 CF FF FF FF inta ; cpu 发出第一个中断应答信号INTA
1115 EE8 FF FF FF FF dup 1, null ; 插入空闲周期,其目的是分开前后两次发出的中断应答信号,便于8259进行识别
1116 ; 使得INTA信号的变化情况为 低电平--高电平--低电平,其中低电平表示应答信号有效
1117 EEC CE C7 E5 FF path inta, mar ; cpu发出第二个中断应答信号INTA,读取中断向量并送入地址寄存器中
1118
1119
1120 ; 转移到中断服务程序执行
1121 EF0 FF 86 FF FF path [mar], pc ; 将mar中的中断向量指向存储单元的内容传送到PC中,
1122 ; 中断向量指向的存储单元实际存储的就是该中断服务程序的入口地址(首条指令地址)
1123 ; 于是,PC转去执行中断服务程序
1124 EF4 C3 FF FF FF reset upc
1125
1126 EF8 FF FF FF FF dup 2, null
1098 EAC FF FF FF FF dup 5, null
1099
1100
1101 ;===========================================================================
1102 ;118. 硬中断处理微指令程序
1103 ; 标志寄存器和断点地址入栈
1104 EC0 BF C1 E1 FF path sp, a
1105 EC4 BF C1 E3 FF path sp, w
1106 EC8 FF D1 E9 DF path alu_dec, sp ; sp减1,指向新的栈顶,为标志寄存器入栈做准备
1107 ECC BF C1 E5 FF path sp, mar
1108 ED0 FF 83 E7 FF path flag, [mar] ; 将标志寄存器入栈,入栈时,栈向低地址空间生长
1109 ED4 BF C1 E1 FF path sp, a
1110 ED8 FF D1 E9 DF path alu_dec, sp ; sp减1,为返回地址入栈做准备
1111 EDC BF C1 E5 FF path sp, mar
1112 EE0 FF 85 E7 FF path pc, [mar] ; 当前PC指向下一条指令,正是返回地址,将其入栈
1113
1114
1115 ; 从8259读取中断号,依据中断号得到对应中断向量
1116 EE4 CF FF FF FF inta ; cpu 发出第一个中断应答信号INTA
1117 EE8 FF FF FF FF dup 1, null ; 插入空闲周期,其目的是分开前后两次发出的中断应答信号,便于8259进行识别
1118 ; 使得INTA信号的变化情况为 低电平--高电平--低电平,其中低电平表示应答信号有效
1119 EEC CE C7 E5 FF path inta, mar ; cpu发出第二个中断应答信号INTA,读取中断向量并送入地址寄存器中
1120
1121
1122 ; 转移到中断服务程序执行
1123 EF0 FF 86 FF FF path [mar], pc ; 将mar中的中断向量指向存储单元的内容传送到PC中,
1124 ; 中断向量指向的存储单元实际存储的就是该中断服务程序的入口地址(首条指令地址)
1125 ; 于是,PC转去执行中断服务程序
1126 EF4 C3 FF FF FF reset upc
1127
1128
1129 ;===========================================================================
1130 ;120. inc rd 自增
1131 F00 FD FF FF FF inc pc
1132 F04 FF 47 EF FF path [pc], ir
1133 F08 BF C1 E1 FF path rd, a
1134 F0C FF D1 E9 D0 path alu_inc, rd ; 将累加器a加1的结果写入目的寄存器rd中
1135 F10 FF CB EB FF path al_flag, flag
1136 F14 FD FF FF FF inc pc
1137 F18 CB FF FF FF check irq
1138 F1C C3 FF FF FF reset upc
1139
1140
1141 ;===========================================================================
1142 ;121. dec rd 自减
1143 F20 FD FF FF FF inc pc
1144 F24 FF 47 EF FF path [pc], ir
1145 F28 BF C1 E1 FF path rd, a
1146 F2C BF C1 E3 FF path rd, w
1147 F30 FF D1 E9 DF path alu_dec, rd ; 将累加器a减1的结果写入目的寄存器rd中
1148 F34 FF CB EB FF path al_flag, flag
1149 F38 FD FF FF FF inc pc
1150 F3C CB FF FF FF check irq
1151 F40 C3 FF FF FF reset upc
1152
1153 F44 FF FF FF FF dup 7, null
\ No newline at end of file
1128 EF8 FF FF FF FF dup 2, null
1129
1130
1131 ;===========================================================================
1132 ;120. inc rd 自增
1133 F00 FD FF FF FF inc pc
1134 F04 FF 47 EF FF path [pc], ir
1135 F08 BF C1 E1 FF path rd, a
1136 F0C FF D1 E9 D0 path alu_inc, rd ; 将累加器a加1的结果写入目的寄存器rd中
1137 F10 FF CB EB FF path al_flag, flag
1138 F14 FD FF FF FF inc pc
1139 F18 CB FF FF FF check irq
1140 F1C C3 FF FF FF reset upc
1141
1142
1143 ;===========================================================================
1144 ;121. dec rd 自减
1145 F20 FD FF FF FF inc pc
1146 F24 FF 47 EF FF path [pc], ir
1147 F28 BF C1 E1 FF path rd, a
1148 F2C BF C1 E3 FF path rd, w
1149 F30 FF D1 E9 DF path alu_dec, rd ; 将累加器a减1的结果写入目的寄存器rd中
1150 F34 FF CB EB FF path al_flag, flag
1151 F38 FD FF FF FF inc pc
1152 F3C CB FF FF FF check irq
1153 F40 C3 FF FF FF reset upc
1154
1155 F44 FF FF FF FF dup 7, null
\ No newline at end of file
......@@ -903,6 +903,8 @@ path [mar], flag
; 出栈后栈顶指针寄存器sp加1,指向先于标志寄存器入栈的对象
path sp, a
path alu_inc, sp
; 查询中断请求,若存在,则继续处理中断
check irq
reset upc
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论