STM32 i GNU assembler - problem z movs

Witam,

Zacząłem coś pisac na STM32F103 i mam problem z GNU assembler (Sourcery G++ Lite).

Wywołuję go: as.exe -mcpu=cortex-m3 -mthumb I nie wiem czy aby poprawnie, bo nie łyka mi

movs R11, #0x000B

Pisze: only lo regs allowed with immediate -- 'movs R11,#0x000B'

Czy ten asembler się nie nadaje dla tego procka? A może użyte opcje są niewłaściwe?

Z góry dzięki za pomoc, SM

Reply to
SM
Loading thread data ...

On 05/06/2010 02:00 AM, SM wrote: [...]

Kompilujesz w trybie thumb, a tam zdaje się masz dostęp tylko do rejestrów R0-R7

pzdr. j.

Reply to
Jacek Radzikowski

No właśnie - chyba używam złej opcji dla asemblera że nie łyka mi tej instrukcji.

Czy ktoś mógłby podpowiedzieć jakiej opcji użyć aby można było kompilować pod STM32F103? Może niewłaściwa wersja asemblera GCC?

SM

P.S. W Programming Manual PM0056 z

formatting link
strona 81/154 przykład użycia MOV jak byk jest: MOVSR11, #0x000B; write value of 0x000B to R11, flags get updated

Reply to
SM

SM pisze:

thumb2?

Reply to
Zbych

Zbych pisze:

Nie łyka ani:

-mcpu=cortex-m3 -mthumb2

ani:

-mcpu=cortex-m3 -mthum-2

SM

Reply to
SM

Zbych pisze:

Nie mam jeszcze procka, więc nie wiem czy to łyknie, ale działa coś takiego:

as.exe -mcpu=cortex-m3 -mimplicit-it=thumb

i na początku w kodzie programu:

.syntax unified .code 16

SM

Reply to
SM

Cortex-M3 pracuje tylko w Thumb-2 więc musi mieć dostęp do wszystkich rejestrów w tym trybie bo praca w trybie ARM (tylko 32bit instrukcje) tam nie istnieje. Thumb-2 łączy w sobie zarówno ARM jak i Thumb (wielkość opcode dla instrukcji może być 16 lub 32 bit).

SM

Reply to
SM

SM pisze:

No i chyba znalazłem odpowiedź:

-mthumb -march=armv7-m uaktywnia thumb-2 do tego w kodzie .syntax unified.

SM

Reply to
SM

To jest wlasnie przyczyna

Wujek Googel mowi :

gas/config/tc-arm.c : if (inst.operands[1].isreg) { (...) } else { if (inst.operands[0].reg > 7) { inst.error = _("only lo regs allowed with immediate"); return; }

Polecam zapoznanie sie z asemblerem procesora, np.

formatting link

Reply to
cepu69

Cortex-M3 nie ma thumb, tylko thumb-2 i wtedy ma dostęp do wszystkich rejestrów.

-mthumb jest OK, brakowało mi "-march=armv7-m" - to przełącza gcc na thumb-2 a .syntax unified "łączy" ARM i thumb.

SM

Reply to
SM

(..)

Niekoniecznie :

formatting link
"The Cortex-M3 core contains a decoder for traditional Thumb and new Thumb-2 instructions"

Czlowiek uczy sie cale zycie :)

eCos

formatting link
(pozwole sobie na drobna reklame) ma ustawine opcje gcc takie jak uzywales poczatkowo

-mcpu=cortex-m3 -mthumb i jak najbardziej wykorzystywane sa instrukcje thumb-2 (...) .syntax unified .thumb (...) .global hal_switch_state_vsr .thumb .thumb_func .type hal_switch_state_vsr, %function hal_switch_state_vsr:

mov r0,#CYGNUM_HAL_CORTEXM_PRIORITY_MAX msr basepri,r0 ^^^^^^^ to jest raczej thumb-2 mov r0,#2 // Set CONTROL register to 2 msr control,r0 isb // Insert a barrier

Dziwnie to wyglada jak dla mnie.

BTW.

formatting link

2.3.1. General-purpose registers

The general-purpose registers r0-r12 have no special architecturally-defined uses. Most instructions that can specify a general-purpose register can specify r0-r12.

Low registers

Registers r0-r7 are accessible by all instructions that specify a general-purpose register. High registers

Registers r8-r12 are accessible by all 32-bit instructions that specify a general-purpose register.

Registers r8-r12 are not accessible by all 16-bit instructions.

Reply to
cepu69

Jest dokładnie tak jak piszesz. Podstawa to ".syntax unified".

Cortex-M3 używa Thumb-2, a więc łączy on ARM (32 bitowe instrukcje) i Thumb (16 bitowe instrukcje) "na raz"- nie trzeba przestawiać procka do pracy w tryb tylko ARM albo tylko Thumb.

Napisałem program używając zarówno instrukcji ARM 32-bit jak i Thumb 16-bit w trybie asemblera Thumb-2.

Potem to wylistowałem. Efekt był taki, że w Thumb-2 można używać zarówno instrukcji ARM jak i Thumb a asembler sam wstawia odpowiednie opcode. Jeśli instrukcja jest dozwolona jako Thumb 16bit, wstawia opcode 16bit, jeśli tylko jako ARM 32bit wstawia opcode 32bit.

SM

Reply to
SM

W dniu 2010-05-06 08:00 SM napisał(a):

lrrrrsaqqwr

Reply to
Adam Dybkowski

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.