在X86架構(gòu)下的電腦上生成ARM架構(gòu)的匯編代碼有兩種方式:
1、使用交叉編譯工具鏈:arm-linux-gcc,指定-S選項(xiàng)可以生成匯編中間文件。
2、使用arm-linux-objdump反匯編arm二進(jìn)制文件。
1、arm-linux-gcc:
首先編寫C程序,假設(shè)名字為test.c,保存test.c文件內(nèi)容:
使用方法如下:
在使用arm-linux-gcc編譯C源文件時(shí),使用-S選項(xiàng)可以將C文件(test.c為例)編譯到匯編階段,生成arm匯編代碼,使用方式如下:
arm-linux-gcc??-march=armv7-a -mtune=cortex-a9??test.c -S -o test.asm??
生成arm匯編文件test.asm。
說明:
-march可以指定目標(biāo)ARM的架構(gòu)可選參數(shù)見(man gcc)
-mtune(類似于-mcpu)可以具體到ARM處理器類型。
注意:
Specifying both -march= and -mcpu= is redundant, and may not in fact have done what you expected in previous compiler versions (maybe even depending on the order in which the arguments were given). The -march switch selects a "generic" ARMv7-A CPU, and -mcpu selects specifically a Cortex-A8 CPU with tuning specific for that core.
Either use "-march=armv7-a -mtune=cortex-a8", or just use "-mcpu=cortex-a8".
所以只用一個(gè)-mcpu=cortex-a9也可以
test.asm內(nèi)容:
01.
??1? ?? ?? ?.arch armv4t??
02.??2? ?? ?? ?.fpu softvfp??
03.??3? ?? ?? ?.eabi_attribute 20, 1??
04.??4? ?? ?? ?.eabi_attribute 21, 1??
05.??5? ?? ?? ?.eabi_attribute 23, 3??
06.??6? ?? ?? ?.eabi_attribute 24, 1??
07.??7? ?? ?? ?.eabi_attribute 25, 1??
08.??8? ?? ?? ?.eabi_attribute 26, 2??
09.??9? ?? ?? ?.eabi_attribute 30, 6??
10. 10? ?? ?? ?.eabi_attribute 18, 4??
11. 11? ?? ?? ?.file? ?"test.c"??
12. 12? ?? ?? ?.section? ?? ???.rodata??
13. 13? ?? ?? ?.align??2??
14. 14 .LC0:??
15. 15? ?? ?? ?.ascii??"hello.world!\000"??
16. 16? ?? ?? ?.text??
17. 17? ?? ?? ?.align??2??
18. 18? ?? ?? ?.global main??
19. 19? ?? ?? ?.type? ?main, %function??
20. 20 main:??
21. 21? ?? ?? ?.fnstart??
22. 22 .LFB2:??
23. 23? ?? ?? ?@ Function supports interworking.??
24. 24? ?? ?? ?@ args = 0, pretend = 0, frame = 0??
25. 25? ?? ?? ?@ frame_needed = 1, uses_anonymous_args = 0??
26. 26? ?? ?? ?stmfd? ?sp!, {fp, lr}??
27. 27? ?? ?? ?.save {fp, lr}??
28. 28 .LCFI0:??
29. 29? ?? ?? ?.setfp fp, sp, #4??
30. 30? ?? ?? ?add? ???fp, sp, #4??
31. 31 .LCFI1:??
32. 32? ?? ?? ?ldr? ???r0, .L3??
33. 33? ?? ?? ?bl? ?? ?puts??
34. 34? ?? ?? ?mov? ???r3, #0??
35. 35? ?? ?? ?mov? ???r0, r3??
36. 36? ?? ?? ?sub? ???sp, fp, #4??
37. 36? ?? ?? ?sub? ???sp, fp, #4??
38. 37? ?? ?? ?ldmfd? ?sp!, {fp, lr}??
39. 38? ?? ?? ?bx? ?? ?lr??
40. 39 .L4:??
41. 40? ?? ?? ?.align??2??
42. 41 .L3:??
43. 42? ?? ?? ?.word? ?.LC0??
44. 43 .LFE2:??
45. 44? ?? ?? ?.fnend??
46. 45? ?? ?? ?.size? ?main, .-main??
47. 46? ?? ?? ?.ident??"GCC: (Sourcery G++ Lite 2009q1-176) 4.3.3"??
48. 47? ?? ?? ?.section? ?? ???.note.GNU-stack,"",%progbits