Jak používat C definuje ARM assembleru

hlasů
7

Jak mohu použít externí definuje jako jsou LONG_MIN a LONG_MAX v ARM assembler kódu?

Řekněme my_arm.h vypadá takto:

int my_arm(int foo);

Řekněme, že mám my_main.c takto:

...
#include <limits.h>   
#include my_arm.h
...
int main (int argc, char *argv[])
{
  int foo=0;
...
  printf(My arm assembler function returns (%d)\n, my_arm(foo));
...
}

A my_arm.s vypadá takto:

  .text
  .align 2
  .global my_arm
  .type   my_arm, %function
my_arm:
    ...
    ADDS r1, r1, r2
    BVS overflow
    ...
overflow: 
    LDR r0, LONG_MAX @ this is probably wrong, how to do it correctly?
    BX lr @ return with max value

Druhý na poslední řádek, nejsem si jistý, jak se správně načíst, Matně si vzpomínám někde četl, že jsem měl definovat LONG_MAX v .global, ale nemůže najít odkaz na pracovním příkladu ještě.

Jsem sestavování s ramenem-linux-gnueabi-gcc verze 4.3.2

==================

UPDATE: Ocenit návrhy! Bohužel, já jsem stále mají problémy s syntaxe.

Za prvé, udělal jsem malou záhlaví souboru mylimits.h (prozatím ve stejné složce jako .s)

#define MY_LONG_MIN 0x80000000

v my_arm.S i přidáno následující:

...
.include mylimits.h
...
ldr r7, =MY_LONG_MIN @ when it was working it was ldr r7, =0x80000000
...

Dva problémy s tímto přístupem.

První největším problémem: symbol MY_LONG_MIN není rozpoznán ... takže něco je stále není v pořádku

Za druhé: syntaxe pro .include nedovolí mi patří <limits.h>, budu muset dodat, že v mylimits.h, se zdá být trochu kludgy, ale předpokládám, že je v pořádku :)

Jakékoliv odkazy?

Mám přístup k systém ramen vývojáře Design Guide a optimalizace System Software [2004] a ARM Architecture Reference Manual [2000], můj cíl je XScale-IXP42x Family REV 2 (v5l) ačkoli.

Položena 19/06/2010 v 16:16
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
11

Často malá přípona souboru .sznamená, že assembler by neměl být prošel c preprocesoru, zatímco velká rozšíření .Sznamená, že by měl. Záleží jen na vaší kompilátor sledovat tuto konvenci i když (GCC porty normálně), tak zkontrolujte jeho dokumentaci.

(EDIT: Všimněte si, že to znamená, že můžete použít direktivy #include - ale pamatujte, že většina souborů, které by zahrnovalo by za normálních okolností být platný assembler (pokud nejsou zcela složeny z #defineitions), takže budete muset napsat vlastní záhlaví, které je )


editovat 5 let později:

Všimněte si, že armcc v5 kompilátor následovně toto chování pod Linuxem ... ale ne na oknech.

Odpovězeno 19/06/2010 v 16:46
zdroj uživatelem

hlasů
2

Pokud používáte gcc a jeho assembler, to je jednoduché: název souboru s finále .S, přidejte na začátek #include <limits.h>a použít všude tam, kde je nutno zajistit konstantní, např ldr r0, SOMETHING; Udělal jsem testy s x86, protože to je to, co mám, ale stejné práce, protože je to gcc funkce.

Odpovězeno 02/07/2010 v 16:31
zdroj uživatelem

hlasů
1

To, co jsem skončil dělat, je toto:

v my_main.c

#include <limits.h>
...
int my_LONG_MAX=LONG_MAX;

pak my_arm.S

ldr r8, =my_LONG_MAX 
ldr r10, [r8] 

Vypadá to convuluted a to je (plus přenositelnost zisky jsou sporné v tomto přístupu).

Musí existovat způsob, jak přistupovat k LONG_MAX přímo v sestavě. Takový způsob bych rád přijímám as plnou odpověď.

Odpovězeno 28/06/2010 v 14:17
zdroj uživatelem

hlasů
0

použijte --cpreproc pro volbu armasm a přidejte

#include "my_arm.h"

do my_arm.s.

to funguje u Keil ARM

Odpovězeno 27/10/2015 v 03:34
zdroj uživatelem

hlasů
0

Viděl jsem prostě krmení gcc zdroje assembleru vs plyn vám umožní dělat C jako věci v assembleru. Ve skutečnosti je to trochu děsivé, když narazíte na situace, kdy je nutné použít gcc jako front-end na plyn dostat něco na práci, ale to je jiný příběh.

Odpovězeno 20/06/2010 v 04:11
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more