【问题标题】:missing arrays in .data section MIPS.data 部分 MIPS 中缺少数组
【发布时间】:2020-03-20 23:26:32
【问题描述】:

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

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

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

谢谢

【问题讨论】:

    标签: mips mars-simulator


    【解决方案1】:

    这是我的经验:

    场景 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. 勾选“汇编目录中的所有文件”
    2. 打开 a.asm,激活窗口
    3. 组装

    结果:工作正常,将正确的数据值放入$t1:200

    场景 B

    与场景 A 相同,但构建步骤 (2.) 改为激活 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 部分中设置的字符串。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多