ваши инструменты расскажут вам все, что вам нужно знать, не нужно использовать SO.
arm-none-eabi-gcc --version
arm-none-eabi-gcc (GCC) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
arm-none-eabi-gcc -O2 -c -march=armv2a so.c -o so.o
arm-none-eabi-gcc: error: unrecognized -march target: armv2a
arm-none-eabi-gcc: note: valid arguments are: armv4 armv4t armv5t armv5te armv5tej armv6 armv6j armv6k armv6z armv6kz armv6zk armv6t2 armv6-m armv6s-m armv7 armv7-a armv7ve armv7-r armv7-m armv7e-m armv8-a armv8.1-a armv8.2-a armv8.3-a armv8.4-a armv8.5-a armv8-m.base armv8-m.main armv8-r iwmmxt iwmmxt2; did you mean ‘armv4’?
arm-none-eabi-gcc --version
arm-none-eabi-gcc (GCC) 5.4.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
arm-none-eabi-gcc -c -march=armvxx so.c -o so.o
arm-none-eabi-gcc: error: unrecognized argument in option ‘-march=armvxx’
arm-none-eabi-gcc: note: valid arguments to ‘-march=’ are: armv2 armv2a armv3 armv3m armv4 armv4t armv5 armv5e armv5t armv5te armv6 armv6-m armv6j armv6k armv6s-m armv6t2 armv6z armv6zk armv7 armv7-a armv7-m armv7-r armv7e-m armv7ve armv8-a armv8-a+crc iwmmxt iwmmxt2 native
, поэтому где-то между 5.4.0 и 9.2.0 g cc упала поддержка armv2 Я подозреваю, что это был 6.xx, но заметки о выпуске от g cc - это то, где искать.
google
gcc no frame pointer
, и вы найдете
-fomit-frame-pointer
-fno-omit-frame-pointer
test it
unsigned int test ( unsigned int a, unsigned int b )
{
return(a+b);
}
arm-none-eabi-g cc -S -march = armv2 так. c
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 1, uses_anonymous_args = 0
@ link register save eliminated.
str fp, [sp, #-4]!
теперь это создает непригодный код, потому что он использует bx lr, так что возможно g cc 5.xx тоже не годится. но чтобы продолжить
arm-none-eabi-gcc -fomit-frame-pointer -S -march=armv2 so.c
test:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
sub sp, sp, #8
str r0, [sp, #4]
, вы можете попробовать это для armv4 и более поздних версий. g cc 5.xx по умолчанию использует указатель кадра
9.2.0 также использует кадр указатель по умолчанию, но опция -fomit-frame-pointer также работает
(я намеренно не оптимизировал, так как это не использовало бы стек, пришлось бы создавать другую тестовую функцию, которая заставляла бы использовать стек и стремление к кадру).
unsigned int another_test ( unsigned int );
unsigned int test ( unsigned int a, unsigned int b )
{
return(another_test(a)<<b);
}
arm-none-eabi-gcc -O2 -S -march=armv7-a so.c
test:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
push {r4, lr}
arm-none-eabi-gcc -fno-omit-frame-pointer -O2 -S -march=armv7-a so.c
test:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 1, uses_anonymous_args = 0
push {r4, r5, fp, lr}
add fp, sp, #12
те же / аналогичные результаты с оптимизацией и более старой версией g cc, где было определено, что рамка не нужна, и по умолчанию она не используется, но если вы ее принудили было бы.