2

配列の最大値を返す関数をアセンブリ (MIPS) でプログラムする必要があります。

Cコードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>

int MaxAssembly(int *ptr, int num_elements); 

int main ( ) 
{ 
  int n=9; 
  int tab[] = {2, -8, 0, 25, 14, 2, 9, 15, -32}; 
  printf("The maximum is %d \n", MaxAssembly(tab,n)); 

MaxAssemblyアセンブリでプログラムする必要がある関数です。

私は最大値を見つける側ではありません。関数の引数を読む際の私の問題。いくつかのテストを行うためにこのコードを作成しました。

    .data

    .text
    .globl  MaxAssembly

MaxAssembly:
    add $9,$5,$zero
    move    $2,$9
    jr  $ra

このコードを実行すると、関数の 2 番目の引数が期待どおりに読み取られていることがわかります。画面に表示されますThe maximum is 9 コードを次のように変更します。

    .data

    .text
    .globl  MaxAssembly

MaxAssembly:
    move    $2,$4
    jr  $ra

関数の最初の引数をメモリアドレスとして読み取り、画面に出力されていることがわかりますThe maximum is 2143429780。これまでのところ、期待どおりに機能しています。

問題は、そのメモリ アドレス (配列の最初の要素) に格納されている要素を読み込もうとしたときです。私は 1 つのセグメンテーション違反を取得しています...私はこれをやっています:

    .data

    .text
    .globl  MaxAssembly

MaxAssembly:
    lw      $16,0($4)
    move    $2,$16
    jr  $ra

私は何を間違っていますか?配列の最初の項目lwに格納することになっていませんでしたか? $16使い方lbは同じ

4

1 に答える 1

2

はい、アドレスからlw $s0, 0($a0)までの完全なワードを読み取ります。lb とは異なり、lw を介したメモリ アクセスでは、ワード アラインされたアドレス (つまり、2 つの LSB がゼロ) を使用する必要があります。問題はそこにあるのではないかと思います。$a0$s0

于 2012-04-08T21:47:35.320 に答える