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

Edit memory address of an initialized .data segment word in MIPS

像这样在 .data 段中初始化一个词后:

.data
base: .word 0

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

我该怎么做?

来自您的评论:

I basically want to allocate memory through syscall 9, and write the address of v0 (which is the base of the allocated address space) into a .data segment tag, and also being able to manipulate it afterwards.

在 C 术语中,您要求的是修改 static int array[] 的地址以将其设置为 malloc 的 return 值。

符号不是这样工作的。当你assemble和link时,它们就变成了固定的数字地址。 lw $t0, base($zero) 运行时不会发生符号-table 查找:机器代码指令将地址硬编码为立即常量。参见 a MIPS ISA reference for the encoding format


您应该做的是将该指针存储在寄存器中,或存储在固定的内存位置,即 static int *pointer。那么你只需要修改指针的value,它还是有自己的地址的。这是对静态数组的额外间接级别,但前提是您将指针保存在内存中。对于寄存器中的指针,指向静态数组还是动态分配的内存都没有关系。

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