2016-06-10 1 views
1

"john"과 "la"라는 문자열을 문자열에 연결하려고하면 "lala"가 인쇄되고 "llll"이 인쇄됩니다. 당신은 숯불에 의해-CHAR 기준으로 두 문자열을 병합 할 경우2 개의 문자열을 밉 (mips) 문자로 연결

.data 
texto: .asciiz "john" 
cifra: .asciiz "la" 
.text 

la $a0,texto #pass address of str1 
la $a1,cifra #pass address of str2 

jal conc 
conc: 
add $t1,$zero,$a0 
add $t2,$zero,$a1 


loop: 
lb $t3($t1) 
lb $t4($t2) 
lbu $t4,0($a1) 
sb $t4, 0($a1) 

beq $t3, $zero, end 
nop 
move $a0,$t4 
li $v0, 11 
syscall 
addi $t1, $t1, 1 
addi $t2,$t2, 1 
j loop 

end: 

답변

0

사실, 올바른 출력은 귀하의 코드도 조립하지 않을 jloahn

입니다. 그리고, 그것은 두 문자열 중 하나를 사용합니다. 두 가지 버전을 제공했습니다. 하나는 버그로 주석 처리됩니다. 다른 하나는 완전히 수정 된 버전입니다. [gratuitous style cleanup을 용서해주십시오.]

주석이 달린 버전 :

.data 
texto:  .asciiz  "john" 
cifra:  .asciiz  "la" 
    .text 

    la  $a0,texto    # pass address of str1 
    la  $a1,cifra    # pass address of str2 

    jal  conc 

    # BUG: no exit program 
    li  $v0,10 
    syscall 

conc: 
    add  $t1,$zero,$a0 
    add  $t2,$zero,$a1 

loop: 
    # BUG: these won't even assemble 
    ###lb  $t3($t1) 
    ###lb  $t4($t2) 

    lb  $t3,0($t1) 
    lb  $t4,0($t2) 

    # BUG: these fetch from $a1 which is never incremented -- in other words, 
    # t4 will always get the same first char (i.e. "l") 
    ###lbu  $t4,0($a1) 
    ###sb  $t4,0($a1) 

    beq  $t3,$zero,end 
    nop 

    # output next char 
    # BUG: this only outputs chars from one string 
    move $a0,$t4 
    li  $v0,11 
    syscall 

    addi $t1,$t1,1 
    addi $t2,$t2,1 
    j  loop 

end: 
    jr  $ra 

위쪽 청소하고 수정 된 버전 :

.data 
texto:  .asciiz  "john" 
cifra:  .asciiz  "la" 
out:  .space  80 

    .text 

    la  $a0,out     # get address of output 

    la  $a1,texto    # pass address of str1 
    la  $a2,cifra    # pass address of str2 
    jal  conc 

    # output the concatenated string 
    la  $a0,out 
    li  $v0,4 
    syscall 

    # BUG: no exit program 
    li  $v0,10 
    syscall 

# conc -- concatenate strings char-by-char 
# 
# arguments: 
# a0 -- output pointer 
# a1 -- pointer to string to concatenate 
# a2 -- pointer to string to concatenate 
conc: 
    lb  $t1,0($a1)    # get string char 
    beqz $t1,conc_no1st   # EOS? if yes, skip 
    addi $a1,$a1,1    # advance 1st source pointer 
    sb  $t1,0($a0)    # add to output 
    addi $a0,$a0,1    # advance output pointer 

conc_no1st: 
    lb  $t2,0($a2)    # add to output 
    beqz $t2,conc_no2nd   # EOS? if yes, skip 
    addi $a2,$a2,1    # advance 2nd source pointer 
    sb  $t2,0($a0)    # add to output 
    addi $a0,$a0,1    # advance output pointer 

conc_no2nd: 
    or  $t1,$t1,$t2    # both chars EOS? 
    bnez $t1,conc    # no, loop 

    sb  $zero,0($a0)   # store final EOS 
    jr  $ra 
+0

내가 "lalal"했지만 원의 출력은'jloahn'가를 기반으로 끝 –

+0

에 대한 감사 귀하의 질문의 제목 [_ "두 문자열을 문자로 연결"_ "두 문자열'존 '과'라 '. 간단한 단어 concat은'johnla'입니다. 따라서 _two_ 문자열에서 두 번째 문자열 (예 : 'lalal') 만 반복하고 길이가 5이고 입력 길이가 각각 4와 2 인 항목으로 어떻게 연결되는지 잘 모르겠습니다. 따라서 적어도 두 개의 입력 문자열을 결합하고 'lalal'출력을 생성하기 위해 어떤 알고리즘이 사용되는지 즉시 알 수 없으므로 질문을 편집하여 도움이 될 수 있습니다. –