• 【计算机系统(1)】5 LC-3中断实验


            最后一个疲了,没太大思路主要是也不太知道中代码怎么实现(丢在哪里就行了嘛?哦,的确如此)。于是乎打开珍藏已久的大佬报告瞄一眼(emmmm还要考试留给我细细琢磨的时间不多),借用了代码顺序自己实现了下。不过他们还真够偷懒,人家要求一个字一个字打印的,好家伙他们直接整行输出!!??这个绝对只能自己实现了。

    目录

    目的与要求

    内容与方法

    用户程序

    键盘中断服务程序

    操作系统支持的代码

    步骤与过程

    程序总体设计

    用户程序

    中断服务程序

    核心数据结构及算法流程

    核心代码

    用户程序

    中断服务程序

    调试过程

    (1)用户连续打印

    (2)中断服务


    目的与要求

    使用实验证明:中断驱动的输入、输出可以中断一个正在运行的程序,执行中断服务程序,返回被中断的程序,从被中断位置下一个地址继续执行(好像什么也没发生似的)。

    试验中我使用键盘作为输入设备,中断正在运行的程序。

    内容与方法

    试验任务包括实现以下三部分程序:

    用户程序

    用户程序将会连续地输出纵横交替的ICS,通过交替,输出两个不同行,如下:

    ICS     ICS     ICS     ICS     ICS     ICS     

         ICS     ICS     ICS     ICS     ICS          

    ICS     ICS     ICS     ICS     ICS     ICS     

         ICS     ICS     ICS     ICS     ICS       

    ICS     ICS     ICS     ICS     ICS     ICS     

         ICS     ICS     ICS     ICS     ICS          

    ICS     ICS     ICS     ICS     ICS     ICS     

         ICS     ICS     ICS     ICS     ICS

    确保输出不至于太快,以至于肉眼不能察觉。因而,需要延时操作,可以考虑如下实现:

    即用户程序包含一小段代码用于每行间的计数,间隔为从2500开始倒计时,计时结束时,再进行输出

    键盘中断服务程序

    键盘中断服务程序将会简单地在屏幕上写上十次,用户随机输入的字符并以Enter(x0A)结束。

    中断服务程序中要求不使用TRAP指令。

    注意,不要忘记保存和恢复在中端服务程序中使用的那些寄存器。

    操作系统支持的代码

    不幸的是,我们还没在LC-3上安装windows或Linux,所以我们必须要求你在你的用户程序代码前先做到以下三个步骤:

    1.正常情况下,操作系统将会先安装一些栈空间,所以当中断发生的时候 PC和PSR可以被放进栈中(正如你知道的,当程序执行RTI,PC和PSR都会被弹出栈,处理器返回到执行被中断的程序)由于没有操作系统,请先把R6初始化为x4000,表示一个空的栈。

    2.正常情况下,操作系统会建立中断向量表,它包含对应中断服务程序的起始地址,你必须为键盘中断先建立一个中断向量表。中断向量表的开始地址是x0100,键盘中断的中断向量是x80。你必须在中断向量表提供一个入口供本实验使用。

    3.操作系统应该设置KBSR的IE(Interrupt Enable)位。

    步骤与过程

    程序总体设计

    用户程序

    • 初始化栈指针R6
    • 中断向量表提供入口
    • 中断使能
    • 显示

    一个打印循环打印2行,第一行循环打印”I” “C” “S” “   ”,直到计数到达6换行;第二行循环打印“   ” ”I” “C” “S”,直到计数到达5换行。

    中断服务程序

    • 保护环境(寄存器)
    • 轮寻打印10次字符
    • 等待输入回车
    • 返回处理

            格式化处理

    为了后续字符能格式化打印(每个字符串”ICS   ”6字符),需要补齐输出2个空格。

            计数减少

    中断共输出12个字符,共占2字符串,字符串计数减2。

            恢复环境

    恢复寄存器。

    核心数据结构及算法流程

    图表 1 用户程序旅程图

    图表 2 中断服务程序

    核心代码

    用户程序

    1. .ORIG x3000
    2. ; initialize the stack pointer
    3. LD R6,sptr
    4. ; set up the keyboard interrupt vector table entry
    5. LD R1,erupt
    6. LD R2,vector
    7. STR R1,R2,0
    8. ; enable keyboard interrupts
    9. LD R3,IE
    10. STI R3,KBSR
    11. ; start of actual user program to print ICS checkerboard
    12. LD R4,six
    13. PRINT1 LD R0,I
    14. OUT
    15. JSR DELAY
    16. LD R0,C
    17. OUT
    18. JSR DELAY
    19. LD R0,S
    20. OUT
    21. JSR DELAY
    22. LEA R0,space
    23. PUTS
    24. ADD R4,R4,-1
    25. BRp PRINT1
    26. LD R0,nextl
    27. OUT
    28. LD R4,six
    29. ADD R4,R4,-1
    30. PRINT2 LEA R0,space
    31. PUTS
    32. LD R0,I
    33. OUT
    34. JSR DELAY
    35. LD R0,C
    36. OUT
    37. JSR DELAY
    38. LD R0,S
    39. OUT
    40. JSR DELAY
    41. ADD R4,R4,-1
    42. BRp PRINT2
    43. LD R0,nextl
    44. OUT
    45. LD R4,six
    46. BRnzp PRINT1
    47. HALT
    48. DELAY ST R1, SaveR1
    49. LD R1, COUNT
    50. REP ADD R1,R1,#-1
    51. BRp REP
    52. LD R1, SaveR1
    53. RET
    54. sptr .FILL x4000
    55. erupt .FILL x2000 ;中断程序入口
    56. vector .FILL x180 ;中断矢量
    57. IE .FILL x4000 ;中断允许标志
    58. KBSR .FILL xFE00
    59. KBDR .FILL xFE02
    60. I .FILL 73
    61. C .FILL 67
    62. S .FILL 83
    63. space .STRINGZ " "
    64. six .FILL 6
    65. COUNT .FILL x3fff
    66. SaveR1 .BLKW 1
    67. nextl .FILL 10
    68. .END

    中断服务程序

    1. .ORIG x2000
    2. ST R0,saveR0
    3. ST R1,saveR1
    4. ST R2,saveR2
    5. LD R2,ten
    6. ; the code
    7. START LDI R1,KBSR ; Test for charac er input
    8. BRzp START
    9. LDI R0, KBDR
    10. ECHO LDI R1, DSR ; Tes OU put regis er ready
    11. BRzp ECHO
    12. STI R0, DDR
    13. ADD R2,R2,-1
    14. BRp ECHO
    15. START1 LDI R1,KBSR ; Test for charac er input
    16. BRzp START1
    17. LDI R0, KBDR
    18. ADD R1,R0,-10
    19. BRz RETURN
    20. BRnzp START1
    21. RETURN LDI R1, DSR ; Tes OU put regis er ready
    22. BRzp RETURN
    23. LD R0,space
    24. STI R0, DDR
    25. Echo LDI R1, DSR ; Tes OU put regis er ready
    26. BRzp Echo
    27. STI R0, DDR
    28. ADD R4,R4,-2
    29. LD R0,saveR0
    30. LD R1,saveR1
    31. LD R2,saveR2
    32. RTI
    33. space .FILL 32
    34. saveR2 .FILL 0
    35. saveR1 .FILL 0
    36. saveR0 .FILL 0
    37. KBSR .FILL xFE00 ; Address of KBSR
    38. KBDR .FILL xFE02 ; Address of KBDR
    39. DSR .FILL xFE04 ; Address of DSR
    40. DDR .FILL xFE06 ; Address of DDR
    41. ten .FILL 10
    42. .END

    调试过程

    1. 1)用户连续打印

    图表 3 用户连续打印

    1. (2)中断服务

     

    图表 4 中断服务

  • 相关阅读:
    web前端-html自定义列表
    文本搜索小程序
    Hbase的SQL接口之Phoenix使用心得
    (Java高级教程)第一章Java多线程基础-第一节6:多线程案例
    Springboot学习
    1360. 日期之间隔几天
    elementui el-table在有summary-method时,table数据行将合计行遮挡住了
    一次违法网站的渗透经历
    STAP旁瓣干扰抑制与干扰对抗仿真
    EasyRecovery16免费版使用人数很多的数据恢复软件
  • 原文地址:https://blog.csdn.net/weixin_51695846/article/details/125440921