ICS-08

TRAP程序和子程序

LC-3TRAP程序

概述

  • 如何为用户程序提供输入和输出操作的权限,一种比较简单和安全解决方法是借助于TRAP指令和操作系统。所谓“操作系统”,就是拥有特权权限的程序。
  • 操作系统通过控制权,分析并处理TRAP指令传递的服务要求,然后将控制权交还给下一地址的指令。称这种用户程序的请求为“服务调用”或“系统调用”

TRAP机制

  • TRAP机制中,包含以下要素
    • 服务程序(service routine)集合:由操作系统提供,但以用户身份执行。这些服务程序是操作系统的组成部分,起始于各自固定的内存地址。LC-3最多可以支持256个服务程序。
    • 起始地址表:包含256个服务程序的起始地址。该表位于内存地址x0000~x00FF。在不同操作系统,表的名称也不同。LC-3的“陷入矢量表”中地址x0021内容是字符输出服务程序的起始地址(x0430),地址x0023的内容是键盘输入服务程序的起始地址(x04A0),地址x00的内容是机器挂起服务程序的起始地址(xFD70)
    • TRAP指令:用户程序如果系统操作系统以用户程序身份执行某个特定的服务程序,并在执行结束后将控制权返回,则可以使用TRAP指令
    • 链接:通过链接回到用户程序。它意味着操作系统所提供的,从服务程序返回用户程序的机制。

TRAP指令

  • 在执行服务程序之前,TRAP指令需要先完成两件事
    • 根据陷入矢量表的内容,将PC值修改为对应于服务程序的起始地址
    • 提供一种机制,返回到调用TRAP指令的程序,即链接
  • TRAP指令由两部分组成:操作码1111和陷入矢量编号(bit[7:0])。位[11:8]必须位0.陷入矢量项标识了用户程序希望操作系统执行的服务程序。
  • TRAP指令在执行时,要完成4件任务
    • 8-bit的陷入矢量零扩展位16-bit地址,并装入MAR。例如对于陷入矢量x23来说,扩展后的地址就是x0023,它代表某个陷入矢量表项的地址
    • 陷入矢量表位于内存x0000-x00FF。随后,表项x0023的内容被读入MDR,即x04A0
    • 将当前PC值存入寄存器R7,以实现返回用户程序的链接机制
    • 将MDR的内容装入PC。至此,完成TRAP指令。

完整机制

  • TRAP服务程序的结尾是“JMP R7”指令。它的作用是将R7的内容装入PC。该值就是用户程序中TRAP指令的下一条指令的地址。
  • 在TRAP服务程序中,JMP R7指令非常有用。为此,在LC-3汇编语言中,专为这个操作定义了一个专用指令字RET
    • 1100 000 111 000000

HALT中断程序

  • 早期,都有一个HALT指定,可用来停止时钟。但由于该指令的使用频率很低,为它分配一个操作符有些浪费。所以,在现代计算机中,改用TRAP指令方式来清除RUN门。
.ORIG xFD70
ST R7,SaveR7
ST R1,SaveR1
ST R0,SaveR0
;
LD R0,ASCIINewLine
TRAP x21
LEA R0,Message
TRAP x22
LD R0,ASCIINewLine
TRAP x21
;
LDI R1,MCR
LD R0,MASK
AND R0,R1,R0
STI R0,MCR
;
LD R1,SaveR1
LD R0,SaveR0
LD R7,SaveR7
RET
;
ASCIINewLine .FILL x000A
SaveR0 .BLKW 1
SaveR1 .BLKW 1
SaveR7 .BLKW 1
Message .STRINGZ "Halting the machine"
MCR .FILL xFFFE
MASK .FILL x7FFF
.END
  • 首先,保存R7、R0、R1的内容。随后,在屏幕上输出提示信息"Halting the machine",最后RUN位(MCR[15])清除操作,将MCR内容和数值0111111111111111相与。

寄存器内容的保存和恢复

  • 一些情况需要显式的保存寄存器的内容:
    • 如果该寄存器的内容会被后续修改
    • 如果在后续操作中将使用该寄存器
  • 保存的方法是,将寄存器内容存入内存中的某个位置,恢复时,将该值重新装入寄存器即可。
  • 有关保存/恢复问题,既可以由调用程序者在TRAP之前负责,也可以由被调用者(TRAP执行之后)来负责。我们称由调用程序负责该问题的方式为“调用者保存(caller-save)”,而称由被调用者负责的方式称为“被调用者保存(callee-save)”。
  • 选择最合适的方式“谁知道谁负责”。

子程序

  • 在一个用户程序中,如果某个程序片段被频繁使用。而我们又希望,不要在每次使用时,重复地实现这些细节。换句话说,我们希望代码可以被重复地利用。还有一种情况,程序调用的部分代码是由生产商或第三方软件商开发的。称这样的代码集合为“库”。

调用/返回机制

  • 调用机制的过程是,首先计算子程序的开始地址,并将其装入PC;然后,保存调用返回地址。在返回机制中,将把返回地址再装入PC
  • 调用/返回机制于TRAP指令的执行过程非常相似,两种情况下,都是先保存返回调用程序的起始地址,R7装入的则是返回调用者的链接地址;代码段的最后一条语句,无论是在中断服务程序还是子程序中,都是JMP,R7指令。
  • 在TRAP方式下,服务程序动用了操作系统资源,因而具备访问计算机底层硬件的特权。通常由系统程序员编写;相比之下,子程序和调用程序可以由同一个程序员编写。但无论什么情况下,它们使用的资源都不会将程序其他代码部分搞混乱,所以我们不将它们看作是用户程序的一部分

JSR指令

  • 在LC-3中,子程序调用指令的操作码是0100。该指令的寻址模式有两中:PC相对寻址和基地址寻址。操作码相同,但助记码不同(分别为JSR和JSRR)
  • 三部分组成opcode、A、Address evaluation
    • b[15:12]代表操作码0100
    • b[11]代表寻址模式:1为PC相对寻址,0为基地址寻址
    • b[10:0]用于子程序起始地址的计算
  • JSR
    • 寻址模式与LD和ST寻址模式几乎一样,只是偏移量更多,有11-bit
  • JSRR
    • 使用b[8:6]存放基寄存器的内容

字符输入的TRAP程序

  • 中断服务程序LC-3键盘读入操作的完整代码
.ORIG x04A0
START ST R7,SaveR7
JSR SaveReg
LD R2,Newline
JSR WriteChar
LEA R1,PROMPT
;
Loop LDR R2,R1,#0
BRz Input
JSR WriteChar
ADD R1,R1,#1
BRnzp Loop
;
Input JSR ReadChar
ADD R2,R0,#0
JSR WriteChar
;
LD R2,Newline
JSR WriteChar
JSR RestoreReg
LD R7,SaveR7
RET;
;
SaveR7 .FILL x0000
Newline .FILL x000A
Prompt .STRINGZ "Input a character>"
;
WriteChar LDI R3,DSR
BRzp WriteChar
STI R2,DDR
RET
DSR .FILL xFE04
DDR .FILL xFE06
;
ReadChar LDI R3,KBSR
BRzp ReadChar
LDI R0,KBDR
RET
KBSR .FILL xFE00
KBDR .FILL xFE02
;
SaveReg ST R1,SaveR1
ST R2,SAveR2
ST R3,SAveR3
ST R4,SAveR4
ST R5,SAveR5
ST R6,SAveR6
RET
;
RestroreReg LD R1,SaveR1
LD R2,SaveR2
LD R3,SaveR3
LD R4,SaveR4
LD R5,SaveR5
LD R6,SaveR6
RET
SaveR1 .FILL x0000
SaveR2 .FILL x0000
SaveR3 .FILL x0000
SaveR4 .FILL x0000
SaveR5 .FILL x0000
SaveR6 .FILL x0000
.END

PUTS:写字符串

  • LC-3汇编语言中,提供了一个对应的陷入矢量将字符串输出到显示器。只需要提供指向该字符串的首地址(在R0中),然后调用TRAP x22即可。我们称这个TRAP操作为“PUTS”。

库程序

  • 在很多应用软件中,都将大量使用各种各样的库程序。使用库函数,我们所需要做的只是:(1)用合适的文档清晰地描述库程序与调用程序之间的接口;(2)在源文件中,正确使用如.EXTERNAL等伪指令。最后,让连接器负责,讲各个独立的汇编模块链接在一起,生成可执行映像。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值