0
@twrcd1227

MIPSアセンブリ言語入門2

分岐命令とジャンプ命令

分岐命令

b (無条件分岐)

無条件にラベル Label に分岐する。
ここで分岐先のアドレスは16bitの相対アドレス

b Label

bnez (条件分岐)

$s00の時にLabelに分岐する。

bnez $s0, Label

beqz (条件分岐)

$s0=0の時にLabelに分岐する。

beqz $s0, Label

ジャンプ命令

j

ラベルLabelにジャンプする。
分岐先のアドレスは28bitのアドレス

j Label

アドレッシングモード

絶対アドレッシング

ジャンプ先のアドレスそのものを書く。
ジャンプ

相対アドレッシング

"ここから~byte先"という形で表現する
分岐

実際に翻訳してみる

loop.c
int i;
int j;

int main()
{
    i = 1;
    j = 0;

loop_begin:
    if (i > 100)
        goto loop_end;
    j = j + i;
    i = i + 1;
    goto loop_begin;

loop_end:
    return 0;
}

これをMIPSのコードにすると

loop.asm
# データ領域開始の宣言
        .data
# int p
        .globl p
p:      .word  0

# int q
        .globl q
q:      .word  0

# テキスト領域開始の宣言
        .text

# int main ()
        .globl main
main:

# p = 1
    li    $s0, 1
    la    $t0, p
    sw    $s0, 0($t0)

# q = 0
    la    $t0, q
    sw    $zero, 0($t0)

# loop_begin
loop_begin:

# if (p > 100) goto loop_end
    la    $t0, p
    lw    $s0, 0($t0)
    li    $s1, 100
    sgt   $t0, $s0, $s1
    bnez  $t0, loop_end

# q = q + p
    la    $t0, q
    lw    $s0, 0($t0)
    la    $t1, p
    lw    $s1, 0($t1)
    add   $s0, $s0, $s1
    sw    $s0, 0($t0)

# p = p + 1
    la    $t0, p
    lw    $s0, 0($t0)
    addi  $s0, $s0, 1
    sw    $s0, 0($t0)


# goto loop_begin
    b     loop_begin

# loop_end
loop_end:

# return 0
    li    $v0, 0
    jr    $ra

このままだとちゃんとp, qの値がちゃんとなっているか分からないので

loop.cの最初に

#include <stdio.h>

最後のところに

printf("p : %d, q : %d \n", p, q);

をつけると

loop.cの実行結果
p : 101, q : 5050 

また、loop.asmloop_end: の最後に

la    $t0, p
lw   $s0, 0($t0)
la    $t1, q
lw    $s1, 0($t1) 

実行後のメモリ(decimal)を見ると

      ・
      ・
R16 [s0] = 101
R17 [s1] = 5050
      ・
      ・

となり、きちんと動いているのが分かる。

関連記事

0
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
twrcd1227
海外旅行とカメラが趣味です。
この記事は以下の記事からリンクされています
twrcd1227MIPSアセンブリ言語入門4からリンク
twrcd1227MIPSアセンブリ言語入門3からリンク
twrcd1227MIPSアセンブリ言語入門1からリンク

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
フロントエンド強化月間 - 開発する上で知っておくべき知見を共有しよう
~
Azure AIを活用した機械学習に関する記事を投稿しよう!
~