在.data段中初始化一个单词后,如下所示:
.data
base: .word 0
我需要在.text段内更改'base'保存的地址。例如,如果'base'存储在地址'268501692'中,我需要将其更改为'268501700'
我怎样才能做到这一点?
来自你的评论:
我基本上想通过系统调用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]
,因为它也是一个链接时间常量。