0

我在 64 位 Windows 7 上运行 QtSpim 9.1.7。在Simulator / Settings / MIPS下,我勾选了所有选项(“Bare Machine”、“Accept Pseudo Instructions”、“Enable Delayed Branches”、“Enabled Delayed Loads”、“启用映射 IO”、“加载异常处理程序”)。

如果我使用以下方式存储硬编码值,我可以运行基本代码以在 QtSpim 中添加值oriori $t0,$0,4现在我想从内存中加载和存储数据,但lw不工作。

.text
.globl main
main:
lw $t0,num1
.data
num1: .word 4

当我重新初始化并加载上述文件时,我收到以下错误消息:“Immediate value is too large for field:”

如果我然后尝试单步执行代码,我会到达 [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):

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

3 回答 3

3

这不是错误。模拟器以裸机模式运行,模拟裸机 MIPS。在这种模式下,加载指令只有一个 16 位的字段,所以它确实不能保存地址。在非裸模式下,spim 会生成一个包含两个指令的序列(lui, lw)来正确寻址数据。

于 2012-10-13T17:25:10.163 回答
0

.data 应该先于一切

如下 :

.data
num1: .word 4

.text
.globl main
main:
lw $t0,num1

li $v0, 10
syscall
.end    
于 2012-10-07T14:25:59.860 回答
0

这似乎是 QtSpim 中的一个错误。相同的代码适用于其他两个环境(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]      
于 2012-10-08T20:00:07.707 回答