QtSpim 在读取字符串后剪切 2 个初始字符
QtSpim cuts the 2 initial chars after string reading
我试过 QtSpim 9.1.16 和 9.1.17,它们都是 "cut" 输入字符串的前 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 来回显缓冲区内容,并添加了一个系统调用 10 来退出程序。
spim 可能很古怪(关于 "falling off the edge of world")。也就是说,如果程序没有正确终止。
当我添加这两个系统调用时,我为程序提供了一个 "soft landing zone" 用于单步执行,"full run" 模式不需要它。因此,我无意中以掩盖 spim 模拟器错误的方式掺假了程序。
当我恢复到您的 exact 程序时,我能够重现您的问题。 spim
似乎做了一些奇怪的事情 如果 文本段中的最后一条指令是单步执行期间的非退出系统调用。
在您的系统调用 11 之后添加 [even] nop
可以解决问题。
我都用过,但我更喜欢 mars
:http://courses.missouristate.edu/KenVollmar/MARS/ 它在 debug/single 步骤、诊断消息、设置 bkpts、数据视图方面组织得更好--YMMV。
我之前下载并破解了两个模拟器的源代码。我一直在做一些清理并添加一些功能。我不是原作者,但我对代码有些熟悉了。
我必须将 gdb
连接到 spim
,看看发生了什么。但是,我已经可以说 step 与 QtSpim
中的 运行 的代码路径有些不同
我试过 QtSpim 9.1.16 和 9.1.17,它们都是 "cut" 输入字符串的前 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 来回显缓冲区内容,并添加了一个系统调用 10 来退出程序。
spim 可能很古怪(关于 "falling off the edge of world")。也就是说,如果程序没有正确终止。
当我添加这两个系统调用时,我为程序提供了一个 "soft landing zone" 用于单步执行,"full run" 模式不需要它。因此,我无意中以掩盖 spim 模拟器错误的方式掺假了程序。
当我恢复到您的 exact 程序时,我能够重现您的问题。 spim
似乎做了一些奇怪的事情 如果 文本段中的最后一条指令是单步执行期间的非退出系统调用。
在您的系统调用 11 之后添加 [even] nop
可以解决问题。
我都用过,但我更喜欢 mars
:http://courses.missouristate.edu/KenVollmar/MARS/ 它在 debug/single 步骤、诊断消息、设置 bkpts、数据视图方面组织得更好--YMMV。
我之前下载并破解了两个模拟器的源代码。我一直在做一些清理并添加一些功能。我不是原作者,但我对代码有些熟悉了。
我必须将 gdb
连接到 spim
,看看发生了什么。但是,我已经可以说 step 与 QtSpim