2016-09-13 1 views
0

私はMIPS MARSアセンブリを使って別の数学計算を行うプログラムを書いていますが、なぜ.dataセクションの文字列値が個々の行ではなくプログラムの先頭にブロックとして出力されているのか理解できません。また、正しいステートメントの横に値を表示することに問題があります。MIPS MARSの個々の行ではなく、異なる行の文字列印刷を1つのブロックで行うのはなぜですか?

.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 

は、誰かが私はこれを理解助けることができますか?

答えて

3

あなたの.dataセグメントで定義されている文字列の末尾に改行文字\nを入れてはいけません。改行は、将来の出力を次の行にプッシュします。そのため、文字列に続いて出力する番号は、後の行に配置されます。

また、これらの文字列にヌルターミネーション文字列(.asciiz)を使用する必要があります。そのため、すべてのステートメントをすぐに印刷することができます。終了文字がないので、コードは印刷を停止するタイミングを知らない。

+1

はあなたにたくさん助けたそんなにありがとう! –

0

更新修正されたコードは:

.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 
+1

うまくいけばうれしいです。しかし、私はいくつかのコメントを追加します。高水準言語(例:C)のアルゴリズムによるコメントをブロックする。レジスタの使用方法を説明するコメントをブロックします。そして、1行のサイドバーには、各命令でアルゴリズムが何をしているのかを詳しく説明するコメントがあります。私の言いたいことのより良い説明については、私の答えを見てください:http://stackoverflow.com/questions/36538325/mips-linked-list/36560575#36560575 –

関連する問題