在.data段中初始化一个单词之后:
.data
base: .word 0
我需要在.text段内更改'base'保存的地址。例如,如果'base'存储在地址'268501692'中,我需要将其更改为'268501700'
我该怎么做?
答案 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]
,因为它也是链接时常量。