.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
中的值为零。此外,字符串 p2
和 p5
似乎不存在于 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
构建:
- 勾选"Assemble all files in directory"
- 打开a.asm,并激活window
- Assemble
结果:工作正常,将正确的数据值输入 $t1
:200
.
场景 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.
我正在使用 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
中的值为零。此外,字符串 p2
和 p5
似乎不存在于 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
构建:
- 勾选"Assemble all files in directory"
- 打开a.asm,并激活window
- Assemble
结果:工作正常,将正确的数据值输入 $t1
:200
.
场景 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.