在MIPS中编辑已初始化的.data段字的内存地址

问题描述 投票:0回答:1

在.data段中初始化一个单词后,如下所示:

.data
base: .word 0

我需要在.text段内更改'base'保存的地址。例如,如果'base'存储在地址'268501692'中,我需要将其更改为'268501700'

我怎样才能做到这一点?

assembly mips mips32
1个回答
2
投票

来自你的评论:

我基本上想通过系统调用9分配内存,并将v0的地址(这是分配的地址空间的基础)写入.data段标记,并且之后能够操作它。

用C语言,你要问的是修改static int array[]的地址,将其设置为malloc的返回值。

这不是符号的工作方式。组合和链接时,它们将成为固定的数字地址。当lw $t0, base($zero)运行时,没有发生符号表查找:机器代码指令将地址硬编码为立即数。见a MIPS ISA reference for the encoding format


你应该做的是将指针存储在寄存器或固定的存储位置,即static int *pointer。然后你只需要修改指针的值,它仍然有自己的地址。这是静态数组的额外间接级别,但前提是将指针保留在内存中。使用寄存器中的指针,无论是指向静态数组还是指向动态分配的内存,都无关紧要。

不要让C语法欺骗你:pointer[10]看起来和array[10]一样,但是在指针的情况下(使用static或全局pointer变量),编译器必须发出首先从内存加载指针的asm,然后取消引用它。但在数组的情况下,array的地址是一个链接时间常量,因此编译器可以直接访问array[10],因为它也是一个链接时间常量。

© www.soinside.com 2019 - 2024. All rights reserved.