我在64位Windows 7上运行QtSpim 9.1.7。在 Simulator / 设置 / MIPS 下,我勾选了所有选项( “裸机”,“接受伪指令”,“启用延迟分支”,“启用延迟加载”,“启用映射IO”,“加载异常处理程序”)。
如果我使用ori
存储硬编码值,我可以运行基本代码在QtSpim中添加值,如下所示:ori $t0,$0,4
。现在我想从内存加载和存储数据,但是lw
无效。
.text
.globl main
main:
lw $t0,num1
.data
num1: .word 4
当我重新初始化并加载上述文件时,我收到以下错误消息:“立即值对于字段来说太大了:”
如果我然后尝试单步执行代码,我就到了行[00400024]。单步执行该行,我收到以下错误消息:“PC = 0x00400024发生异常”/“数据/堆栈读取错误地址:0x00000000”
作为参考,我的代码被解析为:
User Text Segment [00400000]..[00440000]
[00400000] 8fa40000 lw $4, 0($29) ; 183: lw $a0 0($sp) # argc
[00400004] 27a50004 addiu $5, $29, 4 ; 184: addiu $a1 $sp 4 # argv
[00400008] 24a60004 addiu $6, $5, 4 ; 185: addiu $a2 $a1 4 # envp
[0040000c] 00041080 sll $2, $4, 2 ; 186: sll $v0 $a0 2
[00400010] 00c23021 addu $6, $6, $2 ; 187: addu $a2 $a2 $v0
[00400014] 0c100009 jal 0x00400024 [main] ; 188: jal main
[00400018] 00000000 nop ; 189: nop
[0040001c] 3402000a ori $2, $0, 10 ; 191: li $v0 10
[00400020] 0000000c syscall ; 192: syscall # syscall 10 (exit)
[00400024] 8c080000 lw $8, 0($0) [num1] ; 4: lw $t0,num1
我遇到的第一件事是0($0)
肯定不是num1
的地址。我的数据声明不正确吗?如果是这样,我做错了什么?
我不知道它是否相关,但我得到了以下la
和li
命令的语法错误(当我试图找到lw
的替代方法时):< / p>
la $a0,num1
li $t0,4
答案 0 :(得分:3)
这不是错误。模拟器以裸模式运行,模拟裸MIPS机器。加载指令在此模式下只有一个16位字段,因此它实际上无法保存地址。在非裸模式下,spim将生成一个双指令序列(lui,lw)来正确地寻址数据。
答案 1 :(得分:0)
.data应该出现在所有事情之前
如下:
.data
num1: .word 4
.text
.globl main
main:
lw $t0,num1
li $v0, 10
syscall
.end
答案 2 :(得分:0)
这在QtSpim中似乎是bug。相同的代码适用于其他两个环境(QtSpim的版本稍有不同,所以我不确定它是9.1.7中的回归还是环境)...
环境1:EE380 CGI SPIM
可在http://cgi.aggregate.org/cgi-bin/cgispim.cgi访问并运行SPIM 6.3a。它运行代码而不返回错误并生成以下执行跟踪:
SPIM Version 6.3a of January 14, 2001
Copyright 1990-2000 by James R. Larus (larus@cs.wisc.edu).
All Rights Reserved.
[0x00400000] 0x8fa40000 lw $4, 0($29) ; 102: lw $a0, 0($sp) # argc
[0x00400004] 0x27a50004 addiu $5, $29, 4 ; 103: addiu $a1, $sp, 4 # argv
[0x00400008] 0x24a60004 addiu $6, $5, 4 ; 104: addiu $a2, $a1, 4 # envp
[0x0040000c] 0x00041080 sll $2, $4, 2 ; 105: sll $v0, $a0, 2
[0x00400010] 0x00c23021 addu $6, $6, $2 ; 106: addu $a2, $a2, $v0
[0x00400014] 0x0c100008 jal 0x00400020 [main] ; 107: jal main
[0x00400020] 0x3c011001 lui $1, 4097 [num1] ; 4: lw $t0,num1
[0x00400024] 0x8c280000 lw $8, 0($1) [num1]
环境2:Ubuntu
相同的代码在32位Ubuntu 11.10上的QtSpim 9.1.6上执行时没有错误,并生成以下内容:
User Text Segment [00400000]..[00440000]
[00400000] 8fa40000 lw $4, 0($29) ; 183: lw $a0 0($sp) # argc
[00400004] 27a50004 addiu $5, $29, 4 ; 184: addiu $a1 $sp 4 # argv
[00400008] 24a60004 addiu $6, $5, 4 ; 185: addiu $a2 $a1 4 # envp
[0040000c] 00041080 sll $2, $4, 2 ; 186: sll $v0 $a0 2
[00400010] 00c23021 addu $6, $6, $2 ; 187: addu $a2 $a2 $v0
[00400014] 0c100009 jal 0x00400024 [main] ; 188: jal main
[00400018] 00000000 nop ; 189: nop
[0040001c] 3402000a ori $2, $0, 10 ; 191: li $v0 10
[00400020] 0000000c syscall ; 192: syscall # syscall 10 (exit)
[00400024] 3c011001 lui $1, 4097 [num1] ; 4: lw $t0,num1
[00400028] 8c280000 lw $8, 0($1) [num1]