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

时间:2017-12-18 14:12:08

标签: assembly mips mips32

在.data段中初始化一个单词之后:

.data
base: .word 0

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

我该怎么做?

1 个答案:

答案 0 :(得分: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],因为它也是链接时常量。