2016-06-10 62 views
3

我试过了QtSpim 9.1.16和9.1.17,它们都“剪切”输入字符串的前2个字符,将它们设置为0x0,其他ASCII字符正确保存到缓冲区中。这是我的片段中,即使其他的代码,我发现在互联网上带来同样的结果:QtSpim在读取字符串后切割2个字符

.data    # ROM area 
    str_input: .asciiz "Digita la stringa che vuoi controllare (max 10 caratteri): " 

.data    # RAM area 
    buffer:  .space 11 

.text 
.globl main 
    main: li $v0, 4 
      la $a0, str_input 
      syscall    # syscall to print user message 
      #------ 
      la $a0, buffer 
      li $a1, 11 
      li $v0, 8 
      syscall 

例如,如果我在“12345”型,这就是内存转储:

User data segment [10000000]..[10040000] 
[10000000]..[1000ffff] 00000000 
[10010000] 69676944 6c206174 74732061 676e6972 D i g i t a l a s t r i n g 
[10010010] 68632061 75762065 6320696f 72746e6f a c h e v u o i c o n t r 
[10010020] 616c6c6f 28206572 2078616d 63203031 o l l a r e (m a x 1 0 c 
[10010030] 74617261 69726574 00203a29 3433000a a r a t t e r i) : . . . 3 4 
[10010040] 00000035 00000000 00000000 00000000 5 . . . . . . . . . . . . . . . 
[10010050]..[1003ffff] 00000000 

我错过了关于QtSpim的一些信息吗?

+0

我无法重现您的问题[与9.1.17]。我做了代码审查。我添加了一个系统调用4来回显缓冲区,然后添加一个系统调用10来退出程序。除非你是单步执行,否则在你的系统调用11之后,你会“脱离世界的边缘”(即执行什么代码?)。但是,在这里,数据的回声和十六进制转储符合预期的结果。 –

+0

我实际上是单步走,这就是我们的老师建议我们做的。如果我让程序正常运行,没有什么问题......哦,并且您为系统调用10提示,我不知道它。 但你能解释为什么单步会导致这种奇怪的行为?例如,MARS是一个好人,不会行为不端。 – LivingSilver94

回答

1

根据我最重要的评论,我添加了一个系统调用4以回显缓冲区内容,系统调用10则退出程序。

spim可能会古怪(re。“飘落在世界的边缘”)。也就是说,如果程序未正确终止。

当我添加了两个系统调用时,我给程序一个单步“软着陆区”,这是“完全运行”模式所不需要的。因此,我无意中掺杂了该程序,掩盖了Spim模拟器的缺陷。

当我恢复到您的确切的程序时,我能够重现您的问题。看起来spim确实是奇怪的东西如果文本段中的最后一条指令在单步期间是非退出系统调用。

在系统调用11修复问题后添加[even] a nop


我用两个,但我更喜欢marshttp://courses.missouristate.edu/KenVollmar/MARS/它是调试/单步,诊断信息,设置bkpts,数据视图更好的组织 - 因人而异。

我以前下载过并且破解了两个模拟器的源代码。我一直在做一些清理并添加一些功能。我不是原作者,但我对代码已经有点熟悉了。

我必须将gdb连接到spim,看看发生了什么。但是,我已经可以说QtSpim中的步骤和运行的代码路径有所不同

+0

好的,我正在转向MARS。我的考试将在三天内完成,我没有时间照看spim bug。太糟糕了,我更喜欢Qtspim,它的GUI更加整洁。 – LivingSilver94