Большинство здравомыслящих компиляторов компилируются в сборку, а затем вызывают ассемблер, чтобы превратить это в объект.
unsigned int fun ( unsigned int a, unsigned int b)
{
return((a<<1)+(b^0xFF));
}
arm-none-eabi-gcc -O2 -c so.c -o so.o
arm-none-eabi-objdump -D so.o
00000000 <fun>:
0: e22110ff eor r1, r1, #255 ; 0xff
4: e0810080 add r0, r1, r0, lsl #1
8: e12fff1e bx lr
Я считаю, что это самый простой способ прочитать выходные данные, хотя я позволяю собирать их.
Но вы можете сделать это
arm-none-eabi-gcc -O2 -S so.c -o so.s
или
arm-none-eabi-gcc -O2 -c -save-temps so.c -o so.o
и посмотрите на так.
cat so.s
.cpu arm7tdmi
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 1
.eabi_attribute 30, 2
.eabi_attribute 34, 0
.eabi_attribute 18, 4
.file "so.c"
.text
.align 2
.global fun
.arch armv4t
.syntax unified
.arm
.fpu softvfp
.type fun, %function
fun:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
eor r1, r1, #255
add r0, r1, r0, lsl #1
bx lr
.size fun, .-fun
.ident "GCC: (GNU) 8.2.0"
который вы могли бы собрать самостоятельно
arm-none-eabi-as so.s -o so.o
arm-none-eabi-objdump -D so.o
so.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <fun>:
0: e22110ff eor r1, r1, #255 ; 0xff
4: e0810080 add r0, r1, r0, lsl #1
8: e12fff1e bx lr
и получите тот же объект, как если бы вы не делали шаги отдельно. это также означает, что вы можете просто написать свою собственную функцию в ассемблере и связать ее с проектом так же, как скомпилированный объект C.
.global fun
fun:
eor r1, r1, #255
add r0, r1, r0, lsl #1
bx lr
arm-none-eabi-as so.s -o so.o
arm-none-eabi-objdump -D so.o
Disassembly of section .text:
00000000 <fun>:
0: e22110ff eor r1, r1, #255 ; 0xff
4: e0810080 add r0, r1, r0, lsl #1
8: e12fff1e bx lr