总算开始栈了。

栈是一种数据结构,它具有这样的访问性质,后进入的先取走,即后进先出(LIFO)。

栈的内存实现:

由一段连续的内存空间和一个寄存器指针(栈指针)组成。栈指针的内容是一个地址值,始终指向栈的顶部(即最后进入的元素)。压入栈的元素在内存空间都占据一个独立的位置,但是在做出栈和入栈操作时,栈中的其他数据不需要移动,只需要移动栈指针即可。看图说话

顺序压入18、31、5、12,然后弹出两次的图示

 

注意上溢出和下溢出。

下溢出是如果栈中的元素少于弹出的次数,如栈中只有1个,但是执行了两次弹出操作。

上溢出是压入栈的元素个数大于栈的空间。

 

接下来可以通过栈来说明中断驱动I/O第二部分,即I/O数据传输的管理。

包括三部分:中断服务程序的启动、中断服务程序的执行、中断服务程序的返回。

启动和执行:

开始中断执行的准备工作:

1保存当前执行程序的状态,以使得中断程序执行完毕后能恢复之前的程序执行。

2装载中断程序的工作状态,开始中断请求的服务。

 

程序状态指程序运行所涉及资源的快照,包括程序的内存空间和寄存器内容,和两个重要的寄存器:PC和PSR。

PC就是当前程序需要执行的下一条指令。

PSR

PSR[15]是运行模式,即特权(超级用户)0或非特权(用户)1模式

PSR[10:8]代表中断的优先级

PSR[2:0]保存nzp条件码(因为中断程序很可能会修改通用寄存器的值导致条件码发生变化)

 

LC-3将被中断程序的状态信息存入“超级用户栈”(该空间仅在特权模式下使用,其实也是内存空间一部分,只是和普通用户程序的用户栈空间是隔离的),所有程序通过R6(栈指针)访问栈空间。

未使用情况下,内部寄存器Saved.SSP和Saved.USP分别保存两个栈指针(超级栈和普通用户栈)内容,特权模式下,R6中原来的内容存入USP,然后将SSP内容装入R6.这样,中断程序开始前,R6已装入超级用户栈指针的内容,所以PC寄存器和被中断程序的PSR寄存器内容就装入超级用户栈了。

 

中断服务程序的状态载入:

大多数处理器采用矢量中断的工作方式,所以处理器需要把8bit矢量值的地址内容扩展后(即矢量表项的内容)装入PC。

接着是PSR寄存器的装入,将PSR[2:0]内容初始化为0(因为在中断服务程序中,指令还没执行过,nzp应该为初始值0),

因为是特权模式,PSR[15]需要置为0,PSR[10:8]置为中断程序的优先级别。

至此,载入完毕,可以运行中断服务程序了。

中断服务

中断服务程序的执行

中断返回

中断服务程序执行完毕后返回的指令是RTI,将PSR和PC的内容弹出超级用户栈,然后将它们填入处理器的正确位置,这样条件码值也恢复到了中断前的状态,PSR[15]、PSR[10:8]也恢复。PC恢复,这样可以执行下一条指令了。

 

基于栈的算术运算:

有些计算机使用栈而不是通用寄存器来存放计算过程的中间值。

ADD R0,R1,R2

LC-3称作“3地址机器”是因为3个操作单元(2个源操作数和1个目的操作数)都是显式的,

而使用栈方式的计算机,则是如下形式

ADD

硬件默认将栈顶部的两个元素弹出,然后将其相加,再把结果压回栈顶。(意味着需要另外的两条指令,即把需要相加的两个数压入栈,当然,使用通用寄存器方式也需要首先把数放置到对应的寄存器)

(25+17)*(3+2)的整个过程如图

 

数据类型转换:

对于各种指令,确认源操作数的数据类型是非常重要的。

形如A=R+I,当R和I类型不同时,需要将其中之一进行转换(一般是短的转换为长的),再进行相应的操作。

 

ASCII/二进制之间的互转

ASCII码和整数的二进制形式不等价。如"2"码值为00110010(0x32),整数形式为2 0000 0010(0x2) ASCII码值-0x30

'a'(对应16进制的10)码值为0110 0001(0x61) ASCII码值-0x57

'A'(对应16进制ide10)码值为0100 0001(0x41)   ASCII码值-0x37

所以转换有这几种情况

如果ASCII码表示的10进制,如"234",则过程大致为(("2"-0x30)*10+("3"-0x30))*10 + "4"-0x30 (代码过程就不写了)

如果为16进制,还需要考虑为"a"到"f"和“A”到“F”的情况,然后根据不同情况,减去不同值做转换。

二进制转为ASCII就是这个过程的逆向。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值