3

我已经尝试过使用 QtSpim 9.1.16 和 9.1.17,它们都“剪切”了输入字符串的前 2 个字符,将它们设置为0x0,其他 ASCII 字符被正确保存到缓冲区中。这是我的片段,即使我在互联网上找到的其他代码也产生了相同的结果:

.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 的一些东西吗?

4

1 回答 1

1

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

spim 可能很古怪(re. “从世界的边缘掉下来”)。也就是说,如果程序没有正确终止。

当我添加两个系统调用时,我为程序提供了一个单步“软着陆区”,而“完全运行”模式不需要它。因此,我无意中以掩盖 spim 模拟器错误的方式掺假了程序。

当我恢复到您的确切程序时,我能够重现您的问题。如果文本段中的最后一条指令是单步期间的非退出系统调用,这似乎会spim做一些奇怪的事情。

nop在您的系统调用 11 解决问题之后添加 [甚至] a 。


我两者都用过,但我更喜欢marshttp : //courses.missouristate.edu/KenVollmar/MARS/ 它对于调试/单步、诊断消息、设置 bkpts、数据视图--YMMV 组织得更好。

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

我将不得不连接起来gdbspim看看发生了什么。但是,我已经可以说 step 与在 QtSpim 中运行的代码路径有些不同

于 2016-06-10T22:00:34.677 回答