数据段MIPS中缺少数组
我正在MIPS中编写一个程序,使用MARS模拟器读取和写入.pgm文件。它由几个包含不同帮助函数的文件组成,但就本问题而言,有两个文件值得关注:main.asm和writeimage.asm 在writeimage.asm的.data段中,我要初始化: 字符串文字“P5\n” 字符串文字“P2\n” 缓冲区大小,因此我可以使用此参数,而无需硬编码缓冲区大小 以下是writeimage.asm的“序言”(如果我可以这样称呼的话):数据段MIPS中缺少数组,mips,mars-simulator,Mips,Mars Simulator,我正在MIPS中编写一个程序,使用MARS模拟器读取和写入.pgm文件。它由几个包含不同帮助函数的文件组成,但就本问题而言,有两个文件值得关注:main.asm和writeimage.asm 在writeimage.asm的.data段中,我要初始化: 字符串文字“P5\n” 字符串文字“P2\n” 缓冲区大小,因此我可以使用此参数,而无需硬编码缓冲区大小 以下是writeimage.asm的“序言”(如果我可以这样称呼的话): .data myStack:
.data
myStack: .space 5
writeBuffer: .space 128
.align 2
writeBufferSize: .word 128
.align 2
p5: .ascii "P5\n"
.align 2
p2: .ascii "P2\n"
.text
.globl write_image
write_image: ...
出于某种原因,当从main运行程序时,当我尝试访问writeBufferSize
时,如下所示:
la $t0, writeBufferSize
lw $s0, ($t0)
加载到$s0
中的值为零。而且,字符串p2
和p5
似乎不存在于MARS所说的地址中。稍后在代码中,我尝试将这些stings写入一个文件,当我将字符串的地址加载到$a1
并执行系统调用时,打印到文件中的内容是什么;当我查看加载到$a1
中的地址,并使用调试器查看该内存地址的内容时,它是空的,就好像字符串不存在一样
仅当我组装writeimage.asm时,仅当我从main组装时,以及当我组装目录中的所有文件时,我没有此问题
我对此感到非常沮丧,我真的不想在整个代码中硬编码缓冲区长度。请帮忙
谢谢以下是我的经验:
情景A
main.asm:
.data
.extern p3, 4 # this will be commented out in some of the other scenarios
.text
la $t0, p3
lw $t1, ($t0)
a、 asm:
.data
.globl p3 # this will be commented out in some of the other scenarios
p3: .word 200
建造:
$t1
:200
情景B
除了构建步骤(2)之外,与场景A相同。改为激活main.asm的窗口结果:它得到一个汇编程序错误(因此不会运行) 显然,如果它首先看到
.globl
,另一个文件中的.extern
就可以了,但是如果它首先看到.extern
,则认为.globl
是矛盾的
情景C
main.asm:与场景A相同,除了注释掉main.asm
中的
.extern
a、 asm:与方案a相同结果:像A和B这样的构建场景都能正常工作 情景D main.asm:与方案A相同(即使用
.extern
)a、 asm:缺少(注释掉)
.globl
指令结果:无论在组装时激活哪个窗口,都没有组装错误,但代码不正确。标签引用位置
0x10000000
,而不是正确的0x10010000
。因此,零被加载到$t1
中
显然,.extern
满足了汇编程序的要求,因此它默默地允许这样做,即使标签没有真正的定义
建议:方案C-使用
.globl
,但不要使用.extern
此外,当按下组装按钮时,其窗口被激活(最前面)的文件似乎是
.text
和.data
的“第一”文件,因此将有模拟器入口点,例如-因此,您希望在最前面的窗口中使用main进行组装。感谢您的详细回复,我认为它对某人有用,但我发现了错误,基本上它归结为一个设计决策,因此我访问了不应该拥有的内存,并且我重写了在.data部分中设置的字符串。再次感谢!