2

これは宿題の質問ですが、行き詰まっています。

割り当ては、配列内の最大の整数を見つけることです。与えられたCコードは次のとおりです。

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

extern int mybig( int array[] ) ;

void main( char * argv[], int argc )
{
int array[] = { 5, 15, 100, 25, 50, -1 } ;

int biggest ;

biggest = mybig( array ) ;

printf( "Biggest integer in array: %d\n", biggest ) ;

}

これまでに約 10 のバージョンのアセンブリを作成しましたが、これが最も近いものです。

.global mybig
 mybig:  stmfd sp!, {v1-v6, lr}
    mvn v1, #0
 loop:  ldrb a4, [a1], #4
    MOVLT a4, a1
    cmp a1, v1
    bne loop
    ldmfd sp!, {v1-v6, pc}
    .end

一緒にリンクするたびに、無限ループに陥りますが、その理由はわかりません。教授は入門コースで何も教えず、ただそうするように言い、コンパイルしてアセンブルするためのツールチェーンへのリンクをくれました。

編集:これは私が得たところです。プログラムは実行されず、無限ループに陥るだけです。

    .global mybig
mybig:  stmfd sp!, {v1-v6, lr}
    mvn v1, #0
    mov a3, a1
loop:   ldr a4, [a1], #4
    cmp a4, a1
    MOVMI a3, a1
    cmp a1, v1
    bne loop
    mov a1, a4
    ldmfd sp!, {v1-v6, pc}
    .end

Cコードは変更されていません

4

1 に答える 1

1

それが私の解決策です:

.global mybig
 mybig:
   // a1 = Highest word, defaults to 0x80000000 = −2,147,483,648
   // a2 = Pointer to array
   // a3 = current word
    mov a2, a1
    mov a1, #0x80000000
 .Lloop:
    ldr   a3, [a2], #4 // Load word and advance pointer by 4 bytes
    cmn   a3, #1       // Compare with -1
    bxeq  lr           // Return if endmarker was found
    cmp   a1, a3       // Compare current highest word and new word
    movlt a1, a3       // Replace highest word if it was smaller
    b     .Lloop       // Loop again
    .end

これはパフォーマンスに関して考えられる最良のコードではありませんが、自明のはずです。

于 2012-10-25T00:23:55.220 に答える