假設這個高級語言沒有任何與C衝突的東西,你可以使用arm C編譯器從你的代碼段中創建彙編代碼。例如,如果您在在test.c的下面,
void test() {
register int i asm("r0");
register int *a asm("r8");
register int *b asm("r9");
register int *c asm("r10");
for (i = 0; i < 10000; i++) {
a[i] = b[i] + c[i];
}
}
可以運行
arm-linux-androideabi-gcc -O0 -S test.c
創建test.s文件,其中將包含彙編代碼爲你的測試功能,以及一些額外的東西。你可以看到你的循環如何被編譯到下面的程序集中。
<snipped>
.L3:
mov r2, r8
mov r3, r0
mov r3, r3, asl #2
add r3, r2, r3
mov r1, r9
mov r2, r0
mov r2, r2, asl #2
add r2, r1, r2
ldr r1, [r2, #0]
mov ip, sl
mov r2, r0
mov r2, r2, asl #2
add r2, ip, r2
ldr r2, [r2, #0]
add r2, r1, r2
str r2, [r3, #0]
mov r3, r0
add r3, r3, #1
mov r0, r3
.L2:
mov r2, r0
ldr r3, .L5
cmp r2, r3
ble .L3
sub sp, fp, #12
ldmfd sp!, {r8, r9, sl, fp}
bx lr
<snipped>
現在用這個方法的問題是信任編譯器生成你的研究的最佳代碼,這可能不是總是如此,但你會得到快速解答您的問題,如上述,而不是等待人:)
- 額外 -
GCC允許你把變量放到特定的寄存器,見related documentation。
您可以獲取arm指令備忘單here。
GCC的較新版本創建更好的代碼,如預期的那樣。上面的剪切版本是由4.4.3版生成的,我可以確認Linaro的4.7.1版本證明了我的說法。所以,如果你採用我的方法,可以使用最新的工具鏈。
到目前爲止您嘗試過什麼? – 2012-08-16 02:13:55
你可能想澄清你在這裏問的問題--ARM風格的Assembly和Android編程是兩個完全不同的東西; Android是像Java這樣的VM風格環境;你不能使用Assembly,因爲代碼是由運行時解釋的,而不是直接在處理器上運行。 – 2012-08-16 02:20:47
關於你的編輯;你在什麼地方嘗試了ASM;你使用什麼軟件/設備? – 2012-08-16 02:23:51