ARM程序集中最大的整数

时间:2012-10-24 23:36:27

标签: arrays integer arm

这是一个家庭作业问题,但我被困住了。

赋值是找到数组中的最大整数。这是我们给出的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代码没有改变

1 个答案:

答案 0 :(得分: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

虽然这不是关于性能的最佳代码,但它应该是自我解释。