1

处理器型号 I

 ● Registers  
    PC – Program Counter  
    Single data register (accumulator) without name  
    We will use symbol A to describe operations on this register  
 ● Stack with an unspecified implementation  
 ● Data specified by name or value  
    More realistic model will follow later 

  Instruction     Action         Description  
  ---------------------------------------------------------------------
  load data       A = data       Load data to accumulator  
  store data      data = A       Store data from accumulator to memory  
  add data        A += data      Add data to accumulator  
  push data                      Push data onto stack  
  call addr       Push PC        Jump and store return trace on the stack 
                  PC = addr
                  Pop PC 
  return          Pop PC         Return – jump to the previously stored trace addr  
  create data                    Allocate data on stack  
  destroy data                   Deallocate data from stack   

处理器型号 II

● More realistic version of model I  
● Stack explicitly implemented in memory  
● Stack Pointer register - SP  
● Stack operations defined explicitly using SP  
● Allocation and deallocation of local data implemented 
   by changing the value of SP (no data transfer occurs)
● Arguments and local variables accessed by names  
    Still unrealistic  

  Instruction    Action               Description
  ---------------------------------------------------------------------
  load data      A = data             Load data to accumulator (constant or variable)
  store data     data = A             Store data from accumulator to memory
  add data       A += data            Add data to accumulator (constant of variable)
  push data      *--SP = data         Place data on the stack (constant of variable)
  call addr      *--SP = data         Jump storing the return trace on the stack
                 PC = addr            
  return         PC = *SP++           Return to the previously stored trace address
  Create data    SP -= sizeof(data)   Allocate data on the stack
  Destroy data   SP += sizeof(data)   Deallocate data from the stack

上述两张幻灯片是在 x86/MIPS 讲座期间展示的。我没太明白。

我唯一理解的是,有两种使用堆栈调用函数的模型,以及分配/释放堆。一个使用PC,另一个使用SP。

它是在谈论两个不同处理器(x86/MIPS)的模型吗?哪个是给谁的?

任何人都可以解释一下吗?

4

1 回答 1

5

两者都类似于 x86,call将返回地址 (PC) 推入堆栈。请注意,指令执行期间的 PCcall指向指令的结尾/下一条指令的开始,因此 PC 是应该在 a 之后执行的指令的ret地址call

第二个模型更明确地说明了堆栈的工作方式,匹配x86 push// pop/ callret这就是它改变的一切。

MIPSjal将返回地址放入寄存器(链接寄存器$lr是 MIPS 上的 32 个通用整数寄存器之一)。软件可以手动将其推入堆栈(例如在非叶函数中),但 ISA 不知道/不在乎这一点。

MIPS 甚至在架构上都没有隐式用于任何事物的“堆栈指针”。调用堆栈是一种软件约定,尽管它非常有用,基本上所有软件以与 x86 基本相同的方式使用它,只是没有结合修改 SP 和加载或存储的单一指令。

我唯一理解的是,有两种使用堆栈调用函数的模型,以及分配/释放堆。一个使用PC,另一个使用SP。

不,这在所有层面上都是完全错误的。

首先,这些示例都没有显示任何关于堆内存的内容,只是在堆栈中为局部变量(自动存储)保留空间。函数返回时将释放的存储空间。

“堆”内存是分开的。它通常不是单一的东西,例如静态和动态分配在现代操作系统中通常是分开的。但无论如何,动态堆分配malloc会给你一个指向内存的指针,该指针在之后add sp, 16或其他任何情况下仍然有效,并ret拆除当前函数的堆栈帧。

第二,PC 根本不参与存储的分配。详细信息仅显示 PC 被读取为返回地址,并由跳转/调用/ret 指令写入。它也被称为IP,指令指针。在 x86 上,32 位和 64 位版本的 IP 寄存器分别是 EIP / RIP。

于 2019-03-22T07:41:44.370 回答