这是一个家庭作业问题,但我被困住了。
赋值是找到数组中的最大整数。这是我们给出的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代码没有改变
答案 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
虽然这不是关于性能的最佳代码,但它应该是自我解释。