

以下は,文字列中のあるパターンの出現を調べるプログラムである.18 行目の End はプログラムの終了を表すものとする.  
• 入力は,それぞれ char 型の配列 Pat(ベースアドレス$s0) と,Str(ベースアドレス$s1) に与えられる.両方の文字列の終端には NULL
文字 (\0,ASCII コード 0) が置かれている.  
• 文字列 Str にパターン Pat が出現する都度,その先頭の位置を整数配列 AP(ベースアドレス $s2) に記憶し,また,総出現回数をレジスタ$s3
に出力する.例えば,入力が
Pat="ABC",Str="ABCAABCBABC"の場合,AP[0]=0,AP[1](https://i.stack.imgur.com/6x2hs.png)=4,AP[2]=8,$s3=3
が出力される.  
[![画像の説明をここに入力](https://i.stack.imgur.com/6x2hs.png)](https://i.stack.imgur.com/6x2hs.png)

Main:  
add $s3, $zero, $zero  
add $t4, $zero, $zero

LoopO: add $t0, $s0, $zero  
add $t1,$s1,$t4

LoopI: lb $t2, 0($t0)  
beq $t2, $zero, Find  
lb $t3,0($t1)  
beq $t3,$zero,Fin  
bne $t2,$t3,Next  
addi $t0,$t0,1  
addi $t1,$t1,1  
j LoopI

Find:  
sw $t4,0($s2)  
addi $s2,$s2,4  
addi $s3,$s3,1

Next :  
addi $t4,$t4,$t1  
j Loop0

Fin:End

このようなコードで、うまくいけない、もし配列 str と 配列pat にマッチする文字がない時、next にジャンプしても $t4 がずっと
同じ値ので、LOOP0にジャンプする時、add $t1,$s1,$t4 の命令によって、配列str の中にずっと同じ文字に指す  
どうすればいいでしょうか？


CC BY-SA 4.0
2019-07-26T19:19:08.200
56923
2019-07-26T21:20:48.620
35114
question
c assembly mips
mips assembly で文字列中のあるパターンの出現を調べる


走査開始(`LoopO`)の時点で、`$t4` に予め値をセットしておけば良いのではないでしょうか(`sub $t4, $t1, $s1`)。

[code]

    Main:
      la  $s0, pat
      la  $s1, str
      la  $s2, index
      add $s3, $zero, $zero
      add $t1, $s1, $zero
    
    LoopO:
      add $t0, $s0, $zero
      sub $t4, $t1, $s1    # Set new starting index
    
    LoopI:
      lb   $t2, 0($t0)
      beq  $t2, $zero, Find
      lb   $t3, 0($t1)
      beq  $t3, $zero, Fin
      addi $t1, $t1, 1
      bne  $t2, $t3, LoopO
      addi $t0, $t0, 1
      j    LoopI
    
    Find:
      sw   $t4, 0($s2)
      addi $s2, $s2, 4
      addi $s3, $s3, 1
      addi $t1, $t1, 1
      j    LoopO
    
    Fin:
      li $v0, 10
      syscall
    
    .data
    pat: .asciiz "ABC"
    str: .asciiz "ABCAABCBABC"
    index: .word 0:10
    
[/code]


CC BY-SA 4.0
2019-07-26T21:20:48.620
56925
2019-07-26T21:20:48.620
56923
answer