数据段MIPS中缺少数组

数据段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:

我正在MIPS中编写一个程序,使用MARS模拟器读取和写入.pgm文件。它由几个包含不同帮助函数的文件组成,但就本问题而言,有两个文件值得关注:main.asm和writeimage.asm

在writeimage.asm的.data段中,我要初始化: 字符串文字“P5\n” 字符串文字“P2\n” 缓冲区大小,因此我可以使用此参数,而无需硬编码缓冲区大小

以下是writeimage.asm的“序言”(如果我可以这样称呼的话):

                  .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
建造:

  • 选中“汇编目录中的所有文件”
  • 打开a.asm并激活该窗口
  • 集合
  • 结果:它工作正常,将正确的数据值放入
    $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部分中设置的字符串。再次感谢!