Assembly 在MIPS中编辑初始化的.数据段字的内存地址

Assembly 在MIPS中编辑初始化的.数据段字的内存地址,assembly,mips,mips32,Assembly,Mips,Mips32,在初始化.data段内的字后,如下所示: .data base: .word 0 我需要在.text段内更改保存“base”的地址。例如,如果“base”存储在地址“268501692”中,我需要将其更改为“268501700” 我怎样才能做到这一点呢?根据您的评论: 我基本上希望通过syscall 9分配内存,并将v0的地址(这是分配的地址空间的基础)写入.data段标记中,并且能够在以后对其进行操作 在C语言中,您需要修改静态int数组[]的地址,将其设置为malloc的返回值 符号不是这

在初始化.data段内的字后,如下所示:

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

我怎样才能做到这一点呢?

根据您的评论:


我基本上希望通过syscall 9分配内存,并将v0的地址(这是分配的地址空间的基础)写入.data段标记中,并且能够在以后对其进行操作

在C语言中,您需要修改
静态int数组[]
的地址,将其设置为
malloc
的返回值

符号不是这样工作的。组装和链接时,它们将成为固定的数字地址。当
lw$t0,base($零)
运行时,不会发生符号表查找:机器码指令将地址硬编码为立即数常量。看


相反,您应该将该指针存储在寄存器中,或者存储在固定的内存位置,即
static int*pointer
。然后你只需要修改指针的值,它仍然有自己的地址。这是静态数组上额外的间接寻址级别,但前提是将指针保留在内存中。对于寄存器中的指针,它是指向静态数组还是指向动态分配的内存并不重要


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

您不能重命名/重新指定内存单元地址,所以不清楚您真正想要的是什么。
base
只是内存地址的符号名,一旦是1234,它就是1234。如果您想要地址2345,那么使用2345。我想重新指定符号名称指向的位置。这不是不可能吗?不,它是编译时常量,在运行时如果执行
la$1,symbol
,它在指令的机器代码中已经是固定值(运行时没有“symbol”名称/字符串)。这种解决方案在汇编程序中并不存在(无论您最初的问题是什么)。您可以在运行时自行修改指令操作码以更改值(从1234更改为2345),但现在这被认为是“代码气味”,很可能您原来的问题有不同的解决方案。我基本上希望通过syscall 9分配内存,并写入v0的地址(这是分配的地址空间的基)将
v0
存储到某个固定位置,如
base
,即
sw$v0,base
,然后在大量使用分配内存的代码之前,将地址加载到一些备用寄存器中,如
>lw$t6,base
,然后通过
t6
寻址所有内容,如
lw$t0,16($t6)
将从
t6+16
地址加载word。(并且
base:.word 0
用作指针存储,而不是数据存储)然后,如果分配的内存是某种大小为140B的元素数组,您还可以轻松地将寄存器中的值提前,如
addi$t6,$t6140
,以提前到下一个元素。