为什么lw在QtSpim中返回“立即值对于字段来说太大了”?

时间:2012-10-07 11:16:15

标签: assembly spim

我在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的地址。我的数据声明不正确吗?如果是这样,我做错了什么?

我不知道它是否相关,但我得到了以下lali命令的语法错误(当我试图找到lw的替代方法时):< / p>

  • la $a0,num1
  • li $t0,4

3 个答案:

答案 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]