【问题标题】:Why are my different lines of string printing out in one block instead of individual lines in MIPS MARS?为什么我的不同行字符串打印在一个块中,而不是 MIPS MARS 中的单独行?
【发布时间】:2026-01-25 08:40:02
【问题描述】:

我正在使用 MIPS MARS 程序集编写一个程序,该程序集执行不同的数学计算,但我无法理解为什么 .data 部分中的字符串值在程序开头打印为块而不是单独的行.我也无法将值打印在正确的语句旁边。

 .data
   NL:  .asciiz "\n" #NL=new line varible kinda name
   addition: .ascii "The value of a + b = \n"
   subtraction: .ascii "The value of a - b = \n "
   prob_3: .ascii "The value of (a + b) - 8 =  \n"
   prob_4: .ascii "The value of (a + b) - (c + d) =  \n"
   prob_5: .ascii "The value of ((a + b) + (d - c) + 17 =  \n"

.text

  li $s0, 8
  li $s1, 8
  li $s2, 16
  li $s3, 8

  la $a0, addition 
  li $v0, 4 
  syscall 
  add $t1, $s0, $s1
  li $v0, 1
  add $a0, $t1, $zero
  syscall

  la $a0, NL
  li $v0, 4
  syscall

  la $a0, subtraction 
  li $v0, 4 
  syscall 
  sub $t2, $s0, $s1
  li $v0, 1
  sub $a0, $t2, $zero
  syscall

  la $a0, NL
  li $v0, 4
  syscall

  la $a0, prob_3 
  li $v0, 4
  syscall 
  subi $t3, $t1, 8
  li $v0, 1
  sub $a0, $t3, $zero
  syscall

  la $a0, NL
  li $v0, 4
  syscall

  la $a0, prob_4 
  li $v0, 4  
  syscall 
  add $t4, $s2, $s3
  sub $t5, $t1, $t4
  li $v0, 1
  sub $a0, $t5, $zero
  syscall

  la $a0, NL
  li $v0, 4
  syscall

  la $a0, prob_5
  li $v0, 4  
  syscall 
  sub $t6, $s3, $s2
  add $t7, $t1, $t6
  addi $t8, $t7, 17
  li $v0, 1
  add $a0, $t8, $zero
  syscall

我得到的结果:

The value of a + b = 
The value of a - b = 
The value of (a + b) - 8 =  
The value of (a + b) - (c + d) =  
The value of ((a + b) + (d - c) + 17 =  
16
The value of a - b = 
The value of (a + b) - 8 =  
The value of (a + b) - (c + d) =  
The value of ((a + b) + (d - c) + 17 =  
0
The value of (a + b) - 8 =  
The value of (a + b) - (c + d) =  
The value of ((a + b) + (d - c) + 17 =  
8
The value of (a + b) - (c + d) =  
The value of ((a + b) + (d - c) + 17 =  
-8
The value of ((a + b) + (d - c) + 17 =  
25

以及我想要得到的结果:

The value of a + b = 16
The value of a - b = 0 
The value of (a + b) - 8 = 8  
The value of (a + b) - (c + d) = -8
The value of ((a + b) + (d - c) + 17 = 25

谁能帮我解决这个问题?

【问题讨论】:

    标签: assembly mips c-strings mars-simulator


    【解决方案1】:

    .data 段中定义的字符串末尾不应有换行符\n。换行符将未来的输出推送到下一行,因此您在字符串后面打印的数字将放在它后面的行上。

    您还应该对这些字符串使用以空字符结尾的字符串 (.asciiz)。这就是为什么您要一次打印出所有报表的原因;代码不知道何时停止打印,因为没有终止字符。

    【讨论】:

    • 非常感谢您的帮助!
    【解决方案2】:

    更新更正代码:

    .data
        NL:  .asciiz "\n" #NL=new line varible kinda name
        prob_1: .asciiz "The value of a + b = "
        prob_2: .asciiz "The value of a - b =  "
        prob_3: .asciiz "The value of (a + b) - 8 =  "
        prob_4: .asciiz "The value of (a + b) - (c + d) =  "
        prob_5: .asciiz "The value of ((a + b) + (d - c) + 17 =  "
    
    .text
    
      li $s0, 8
      li $s1, 8
      li $s2, 16
      li $s3, 8
    
      la $a0, prob_1 
      li $v0, 4 
      syscall 
      add $t1, $s0, $s1
      li $v0, 1
      add $a0, $t1, $zero
      syscall
    
      la $a0, NL
      li $v0, 4
      syscall
    
      la $a0, prob_2 
      li $v0, 4 
      syscall 
      sub $t2, $s0, $s1
      li $v0, 1
      sub $a0, $t2, $zero
      syscall
    
      la $a0, NL
      li $v0, 4
      syscall
    
      la $a0, prob_3 
      li $v0, 4
      syscall 
      subi $t3, $t1, 8
      li $v0, 1
      sub $a0, $t3, $zero
      syscall
    
      la $a0, NL
      li $v0, 4
      syscall
    
      la $a0, prob_4 
      li $v0, 4  
      syscall 
      add $t4, $s2, $s3
      sub $t5, $t1, $t4
      li $v0, 1
      sub $a0, $t5, $zero
      syscall
    
      la $a0, NL
      li $v0, 4
      syscall
    
      la $a0, prob_5
      li $v0, 4  
      syscall 
      sub $t6, $s3, $s2
      add $t7, $t1, $t6
      addi $t8, $t7, 17
      li $v0, 1
      add $a0, $t8, $zero
      syscall
    

    【讨论】:

    • 很高兴您的工作顺利进行。但是,我会添加一些 cmets。使用高级语言(例如 C)的算法来阻止 cmets。描述如何使用寄存器的块 cmets。并且,每行侧边栏 cmets 详细说明了算法在每条指令上所做的事情。要更好地解释我的意思,请参阅我的回答:*.com/questions/36538325/mips-linked-list/…
    最近更新 更多