.data 部分 MIPS 中缺少数组

missing arrays in .data section MIPS

我正在使用 MARS 模拟器在 MIPS 中开发一个程序来读写 .pgm 文件。它由几个包含不同辅助函数的文件组成,但出于这个问题的目的,有 2 个文件值得关注:main.asm 和 writeimage.asm.

在writeimage.asm的.data段中,我要初始化: 字符串文字 "P5\n" 字符串文字 "P2\n" 缓冲区大小,这样我就可以使用这个参数而不必硬编码缓冲区大小。

这是 writeimage.asm 的 'preamble'(如果我可以这样称呼的话):

                  .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 中的值为零。此外,字符串 p2p5 似乎不存在于 MARS 所说的地址中。稍后在代码中我尝试将这些字符串写入文件,当我加载地址时将字符串转换为 $a1 并执行系统调用,打印到文件中的内容什么也没有;当我查看加载到 $a1 的地址并使用调试器查看该内存地址的内容时,它是空白的,就好像该字符串从未存在过一样。

仅当我 assemble writeimage.asm 时,只有当我从 main assemble 以及当我 assemble 目录中的所有文件时,我才没有这个问题。

我对此感到非常沮丧,我真的不想在我的代码中对缓冲区长度进行硬编码。请帮忙!

谢谢

这是我的经验:

场景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

构建:

  1. 勾选"Assemble all files in directory"
  2. 打开a.asm,并激活window
  3. Assemble

结果:工作正常,将正确的数据值输入 $t1200.

场景 B

与方案 A 相同,除了构建步骤 (2.) 为 main.asm 激活 window 而不是

结果:出现 assembler 错误(因此不会 运行)!

显然,如果它先看到.globl,另一个文件中的.extern就可以了,但是如果它先看到.extern,那么.globl就被认为是矛盾的.

场景 C

main.asm:同场景A,只是注释掉main.asm中的.extern

a.asm:与方案 A 相同

结果:A 和 B 等构建方案均正常工作!

场景 D

main.asm:与方案 A 相同(即使用 .extern

a.asm:缺少(注释掉).globl 指令

结果:无论assemble激活哪个window,都没有汇编错误,但代码不正确。标签引用位置 0x10000000,而不是正确的 0x10010000。因此,零被加载到 $t1.

显然 .extern 满足 assembler,所以它默默地允许了这一点,即使没有真正的标签定义。


建议:方案 C — 使用 .globl,但不要使用 .extern

此外,当按下 assemble 按钮时,其 window 被激活(最重要)的文件似乎是 "first" 对于 .text.data,这样就会有模拟器入口点,例如——结果,你想 assemble 和你的 main 在最前面 window.