2016-06-10 61 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