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 ) ;

}

到目前为止,我已经制作了大约十几个版本的程序集,但这是我得到的最接近的版本

.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 回答