堆栈的问题 SP指针

为什么将SP设为 4096 设定之后怎么运行?是从4096开始写然后再写4095还是往4097写?4096是steppingstone的地址吗?
中断为什么设为3072?

 

 

S3C2410、S3C2440有内部RAM、外部的SDRAM,这些都被称为内存;
SP设在内存上,可以是内部RAM,也可以是SDRAM,只要不破坏当前运行的程序就可以了。


启动时首先执行内部RAM的4096,然后将NAND的代码移到SDRAM上执行:
答:在一开始,SDRAM是不可用的,所以在初始化SDRAM之前,如果想使用C函数,就要把SP设在内部RAM中。


此时将SDRAM的前4096设定为堆栈,4096后为代码区域,对不?
答:不对。程序要把开始运行时,这4096的内部RAM里有代码,这些代码初始化SDRAM、从NAND中读取全部代码到SDRAM中──完成这些功能的代码很小,不到4096字节,所以可以把SP设在4096处。

### PUSH指令对堆栈指针SP的影响及变化过程 在计算机体系结构中,`PUSH` 指令是一种常见的操作,用于将数据压入堆栈。具体来说,在执行 `PUSH` 指令的过程中,堆栈指针(Stack Pointer, SP)会发生相应的变化以反映新数据被加入堆栈的操作。 #### ARM 架构下的堆栈指针行为 在 ARM 架构下,当执行一条 `PUSH` 指令时,堆栈指针的行为取决于具体的堆栈增长方向以及实现方式。通常情况下,ARM 使用的是 **满递减堆栈模型**(Full Descending Stack Model),这意味着: - 堆栈是从高地址向低地址生长的。 - 在写入数据之前,堆栈指针会先减少一定的大小(通常是 4 字节,对应于一个寄存器的宽度)。 因此,执行 `PUSH {Rn}` 这样的指令时,堆栈指针首先会被更新为当前值减去 4,随后该寄存器的内容才会被存储到新的堆栈位置[^2]。 #### x86 架构下的堆栈指针行为 相比之下,在 x86 架构中,`PUSH` 指令的具体实现略有不同。x86 处理器支持多种堆栈模式,但最常见的也是 **满递减堆栈模型**。在这种模式下: - 执行 `PUSH` 操作前,堆栈指针SP 或 RSP)会先递减一定量的空间(通常是 2 字节或 4 字节,视目标平台而定)。 - 随后,要保存的数据会被写入由堆栈指针指定的新内存位置[^1]。 值得注意的是,在某些特定场景下,比如早期的 8086 处理器中,由于采用了分段机制,实际物理地址是由段寄存器 SS 和偏移量 SP 组合计算得出的。这种组合形式 `[SS*10H+SP]` 被用来定位堆栈中的确切位置[^3]。 #### 变化总结 无论是哪种架构,`PUSH` 指令都会引起如下一系列动作: 1. 减少堆栈指针的数值以便腾出空间存放即将压入的数据; 2. 将待处理的数据复制至调整后的堆栈区域。 以下是伪代码展示这一逻辑流程: ```python def push(data): sp = get_stack_pointer() # 获取当前堆栈指针 new_sp = sp - size_of_data # 更新堆栈指针 set_stack_pointer(new_sp) # 设置新的堆栈指针 write_memory(new_sp, data) # 向新位置写入数据 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值