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

Merge branch 'ret' into 'master'

修改调用指令微程序 See merge request engintime/Dream-Logic/Project-Template/DM1000/DM1000!14
没有这种文件类型的预览
...@@ -371,90 +371,104 @@ ...@@ -371,90 +371,104 @@
0371 ;======================================================================= 0371 ;=======================================================================
0372 ;子程序调用返回指令 0372 ;子程序调用返回指令
0373 ; ret 0373 ; ret
0374 640 EF F7 F2 FF path sp, mar ;将栈指针(栈顶地址)传送到 MAR 0374
0375 644 EF FF 72 FF path sp, csp ; 0375 ; 返回地址出栈
0376 648 E7 FF FF FF path sp_inc, csp ; 0376 640 EF F7 F2 FF path sp, mar ;将栈指针(栈顶地址)传送到 MAR
0377 64C EF FE F8 FF path csp, sp ;SP = SP + 1,出栈,更新栈顶 0377 644 EF EB F9 FF path [mar], pc ;将返回地址加载到PC
0378 650 EF EB F9 FF path [mar], pc ;将调用返回地址加载到PC,转移到调用处的下一条指令继续执行 0378
0379 654 CF FF FF FF reset upc 0379 ; 出栈时,栈顶向高地址方向生长,sp+1指向新的栈顶
0380 0380 648 EF FF 72 FF path sp, csp
0381 658 FF FF FF FF dup 2, null 0381 64C E7 FF FF FF path sp_inc, csp
0382 0382 650 EF FE F8 FF path csp, sp ;SP = SP + 1,出栈,更新栈顶
0383 ;======================================================================= 0383 654 CF FF FF FF reset upc
0384 0384
0385 ; 填充空白指令 0385 658 FF FF FF FF dup 2, null
0386 660 FF FF FF FF dup 8, null 0386
0387 0387 ;=======================================================================
0388 ; shr a 0388
0389 680 EF FF D5 90 path alu_shr, a ;累加器A 进行逻辑右移,结果写回A中 0389 ; 填充空白指令
0390 684 FF FF FF FF inc pc 0390 660 FF FF FF FF dup 8, null
0391 688 CF FF FF FF reset upc 0391
0392 0392 ; shr a
0393 68C FF FF FF FF dup 5, null 0393 680 EF FF D5 90 path alu_shr, a ;累加器A 进行逻辑右移,结果写回A中
0394 0394 684 FF FF FF FF inc pc
0395 ; shl a 0395 688 CF FF FF FF reset upc
0396 6A0 EF FF D6 90 path alu_shl, a ;累加器A 进行逻辑左移,结果写回A中 0396
0397 6A4 FF FF FF FF inc pc 0397 68C FF FF FF FF dup 5, null
0398 6A8 CF FF FF FF reset upc 0398
0399 0399 ; shl a
0400 6AC FF FF FF FF dup 5, null 0400 6A0 EF FF D6 90 path alu_shl, a ;累加器A 进行逻辑左移,结果写回A中
0401 0401 6A4 FF FF FF FF inc pc
0402 ; rcr a 0402 6A8 CF FF FF FF reset upc
0403 6C0 EF FF E5 90 path alu_rcr, a ;累加器A 进行循环右移,结果写回A中 0403
0404 6C4 FF FF FF FF inc pc 0404 6AC FF FF FF FF dup 5, null
0405 6C8 CF FF FF FF reset upc 0405
0406 0406 ; rcr a
0407 6CC FF FF FF FF dup 5, null 0407 6C0 EF FF E5 90 path alu_rcr, a ;累加器A 进行循环右移,结果写回A中
0408 0408 6C4 FF FF FF FF inc pc
0409 ; rcl a 0409 6C8 CF FF FF FF reset upc
0410 6E0 EF FF E6 90 path alu_rcl, a ;累加器A 进行循环左移,结果写回A中 0410
0411 6E4 FF FF FF FF inc pc 0411 6CC FF FF FF FF dup 5, null
0412 6E8 CF FF FF FF reset upc 0412
0413 6EC FF FF FF FF dup 5, null 0413 ; rcl a
0414 0414 6E0 EF FF E6 90 path alu_rcl, a ;累加器A 进行循环左移,结果写回A中
0415 ; nop 0415 6E4 FF FF FF FF inc pc
0416 700 FF FF FF FF inc pc 0416 6E8 CF FF FF FF reset upc
0417 704 CF FF FF FF reset upc 0417 6EC FF FF FF FF dup 5, null
0418 0418
0419 708 FF FF FF FF dup 6, null 0419 ; nop
0420 0420 700 FF FF FF FF inc pc
0421 ; not a 0421 704 CF FF FF FF reset upc
0422 720 EF FF F4 B0 path alu_not, a ;累加器A 取反运算,结果写回A中 0422
0423 724 FF FF FF FF inc pc 0423 708 FF FF FF FF dup 6, null
0424 728 CF FF FF FF reset upc 0424
0425 0425 ; not a
0426 72C FF FF FF FF dup 5, null 0426 720 EF FF F4 B0 path alu_not, a ;累加器A 取反运算,结果写回A中
0427 0427 724 FF FF FF FF inc pc
0428 ;============================================================= 0428 728 CF FF FF FF reset upc
0429 ;子程序调用指令,双字节指令,第二个字节是调用子程序标号,该标号实质为一个地址,所指存储单元中就是被调用子程序的入口地址(起始地址) 0429
0430 ; call symbol 0430 72C FF FF FF FF dup 5, null
0431 740 FF FF FF FF inc pc ;PC+1 0431
0432 744 EF 7D F9 FF path [pc], asr ;将PC指向存储单元内容写入辅助寄存器ASR中,也就是将被调用子程序的入口地址暂存到ASR中 0432 ;=============================================================
0433 748 EF FF 72 FF path sp, csp 0433 ;子程序调用指令,双字节指令,第二个字节是调用子程序标号,该标号实质为一个地址,所指存储单元中就是被调用子程序的入口地址(起始地址)
0434 74C EF FF FF FF path sp_dec, csp 0434 ; call symbol
0435 750 EF FE F8 FF path csp, sp ;返回地址入栈前,先将SP-1,指向新的栈顶 0435
0436 754 EF F7 F2 FF path sp, mar 0436 ; 将子程序入口地址保存到辅助寄存器asr中
0437 758 FF FF FF FF inc pc ;PC+1,指向下一条指令,即返回地址 0437 740 FF FF FF FF inc pc ;PC+1
0438 75C ED FB F3 FF path pc, [mar] ;将PC(返回地址)入栈 0438 744 EF 7D F9 FF path [pc], asr ;将PC指向存储单元内容写入辅助寄存器ASR中,也就是将被调用子程序的入口地址暂存到ASR中
0439 760 EF EF F7 FF path asr, pc ;将ASR寄存器的值加载到PC,也就是将调用子程序的入口地址加载到PC,转移到子程序处执行 0439
0440 764 CF FF FF FF reset upc 0440 ; pc+1,得到返回地址
0441 0441 748 FF FF FF FF inc pc ;PC+1,指向下一条指令,即返回地址
0442 768 FF FF FF FF dup 6, null 0442
0443 0443 ; sp-1,为返回地址入栈分配一个新的空间,入栈时,栈顶向低地址方向生长
0444 ; 填充空白指令 0444 74C EF FF 72 FF path sp, csp
0445 780 FF FF FF FF dup 16, null 0445 750 EF FF FF FF path sp_dec, csp
0446 0446 754 EF FE F8 FF path csp, sp ;返回地址入栈前,先将SP-1,指向新的栈顶
0447 ;=============================================================== 0447
0448 ;中断返回指令,可参照子程序调用返回指令,出 0448 ; 返回地址入
0449 ; iret 0449 758 EF F7 F2 FF path sp, mar
0450 7C0 EF F7 F2 FF path sp, mar 0450 75C ED FB F3 FF path pc, [mar] ;将PC(返回地址)入栈
0451 7C4 EF FF 72 FF path sp, csp 0451
0452 7C8 E7 FF FF FF path sp_inc, csp 0452 ; 将调用子程序入库地址加载到PC,实现子程序调用
0453 7CC EF FE F8 FF path csp, sp 0453 760 EF EF F7 FF path asr, pc ;将ASR寄存器的值加载到PC,也就是将调用子程序的入口地址加载到PC,转移到子程序处执行
0454 7D0 EF EB F9 FF path [mar], pc 0454 764 CF FF FF FF reset upc
0455 7D4 CF FF FF FF reset upc 0455
0456 0456 768 FF FF FF FF dup 6, null
0457 7D8 FF FF FF FF dup 2, null 0457
0458 0458 ; 填充空白指令
0459 0459 780 FF FF FF FF dup 16, null
0460 0460
0461 ;===============================================================
0462 ;中断返回指令,可参照子程序调用返回指令,出栈
0463 ; iret
0464 7C0 EF F7 F2 FF path sp, mar
0465 7C4 EF FF 72 FF path sp, csp
0466 7C8 E7 FF FF FF path sp_inc, csp
0467 7CC EF FE F8 FF path csp, sp
0468 7D0 EF EB F9 FF path [mar], pc
0469 7D4 CF FF FF FF reset upc
0470
0471 7D8 FF FF FF FF dup 2, null
0472
0473
0474
...@@ -371,11 +371,15 @@ dup 16, null ...@@ -371,11 +371,15 @@ dup 16, null
;======================================================================= ;=======================================================================
;子程序调用返回指令 ;子程序调用返回指令
; ret ; ret
; 返回地址出栈
path sp, mar ;将栈指针(栈顶地址)传送到 MAR path sp, mar ;将栈指针(栈顶地址)传送到 MAR
path sp, csp ; path [mar], pc ;将返回地址加载到PC
path sp_inc, csp ;
; 出栈时,栈顶向高地址方向生长,sp+1指向新的栈顶
path sp, csp
path sp_inc, csp
path csp, sp ;SP = SP + 1,出栈,更新栈顶 path csp, sp ;SP = SP + 1,出栈,更新栈顶
path [mar], pc ;将调用返回地址加载到PC,转移到调用处的下一条指令继续执行
reset upc reset upc
dup 2, null dup 2, null
...@@ -428,14 +432,24 @@ dup 5, null ...@@ -428,14 +432,24 @@ dup 5, null
;============================================================= ;=============================================================
;子程序调用指令,双字节指令,第二个字节是调用子程序标号,该标号实质为一个地址,所指存储单元中就是被调用子程序的入口地址(起始地址) ;子程序调用指令,双字节指令,第二个字节是调用子程序标号,该标号实质为一个地址,所指存储单元中就是被调用子程序的入口地址(起始地址)
; call symbol ; call symbol
; 将子程序入口地址保存到辅助寄存器asr中
inc pc ;PC+1 inc pc ;PC+1
path [pc], asr ;将PC指向存储单元内容写入辅助寄存器ASR中,也就是将被调用子程序的入口地址暂存到ASR中 path [pc], asr ;将PC指向存储单元内容写入辅助寄存器ASR中,也就是将被调用子程序的入口地址暂存到ASR中
; pc+1,得到返回地址
inc pc ;PC+1,指向下一条指令,即返回地址
; sp-1,为返回地址入栈分配一个新的空间,入栈时,栈顶向低地址方向生长
path sp, csp path sp, csp
path sp_dec, csp path sp_dec, csp
path csp, sp ;返回地址入栈前,先将SP-1,指向新的栈顶 path csp, sp ;返回地址入栈前,先将SP-1,指向新的栈顶
; 返回地址入栈
path sp, mar path sp, mar
inc pc ;PC+1,指向下一条指令,即返回地址
path pc, [mar] ;将PC(返回地址)入栈 path pc, [mar] ;将PC(返回地址)入栈
; 将调用子程序入库地址加载到PC,实现子程序调用
path asr, pc ;将ASR寄存器的值加载到PC,也就是将调用子程序的入口地址加载到PC,转移到子程序处执行 path asr, pc ;将ASR寄存器的值加载到PC,也就是将调用子程序的入口地址加载到PC,转移到子程序处执行
reset upc reset upc
......
没有这种文件类型的预览
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论