编辑 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 时间常数。
像这样在 .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 时间常数。