2016-09-13 1 views
0

다른 수학 계산을하는 MIPS MARS 어셈블리를 사용하는 프로그램을 작성 중이며 왜 .data 섹션의 문자열 값이 개별 행 대신 프로그램 시작 부분에 블록으로 인쇄되는지 이해하는 데 문제가 있습니다. 올바른 문 옆에 값을 출력하는 데 문제가 있습니다.MIPS MARS의 개별 줄 대신 한 줄에 다른 줄의 문자열 인쇄가 나타나는 이유는 무엇입니까?

.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

당신에게 alot을 도움을 너무 많이 주셔서 감사합니다! –

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)의 알고리즘으로 설명을 차단하십시오. 레지스터 사용 방법을 설명하는 주석을 차단하십시오. 그리고 라인 사이드 바에는 각 명령어에서 알고리즘이 수행하는 작업을 자세히 설명하는 주석이 있습니다. 내 뜻을 더 잘 설명하려면 내 대답을 참조하십시오. http://stackoverflow.com/questions/36538325/mips-linked-list/36560575#36560575 –

관련 문제