【问题标题】:subroutine call using stack使用堆栈调用子程序
【发布时间】:2015-07-08 14:17:04
【问题描述】:

我无法理解这个问题。

"内存栈顶的内容是5320。栈指针(SP)的内容是3560。一个两字的调用子程序指令位于内存中的地址1120,后跟地址字段6720的地址1121.PC、SP和栈顶的内容是什么:

  • 从内存中取出调用指令之前
  • 调用指令执行后。
  • 从子程序返回后"

1.在获取调用指令之前,PC 将调用指令的地址保存在内存中,即1120。当时SP = 3560,M[SP] = 5320。

2.调用指令解码执行后,PC递增(PC=PC+1),等于返回地址1121,存放在栈顶。假设,堆栈指针每 push 减 1 (SP = SP - 1),每 pop 加 1 (SP = SP + 1)。 因此,SP 值为 3560 - 1 = 3559 和 M[3559] = 1121(返回地址)。

3.子程序执行完毕后,返回地址传送给PC(PC = M[SP]),SP递增(pop)(SP = SP + 1) 所以,现在 PC = 1121 和 SP = 3559 + 1 = 3560 ,并且 M[SP] = M[3560] = 5320。

到目前为止,这就是我所知道的,作为一个初学者。

我的问题是:

1.我做的对吗?

2。如果不是,请解释原因。

3.如果是,那么在计算中没有任何作用的其他值的意义是什么?

【问题讨论】:

    标签: architecture stack subroutine


    【解决方案1】:

    1) 这部分的答案是正确的。

    2) call 指令执行后,PC 中的当前值将被压入堆栈,由于是压入操作,堆栈指针将减 1,新的 PC 值将是当前的起始地址子程序。 电脑:6720 Sp=Sp-1; 3560-1=3559 TOS 1122 :这有点棘手,在这种情况下,我们无法确定我们必须跳转到哪里,除非我们在 1121 获取并解码指令,它会告诉我们跳转到哪里。由于地址 (6270) 是从 1121 获得的,因此 PC 在其值被压入堆栈之前必须指向 1122。因此 1122 被压入堆栈。

    3) TOS 将弹出,这将是我们的新 PC。 TOS 是 1122 所以,PC:1122 新的 TOS 将是 1122 之前的值,即初始值:5320。 pop操作递增SP的值,SP=SP+1=3560

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2017-11-13
      • 2022-01-17
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      • 2011-04-24
      相关资源
      最近更新 更多