PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : "Assamblerfunktionen" in C importieren?



kante23
05.12.2007, 09:17
Hallo,
ich hab schon einige Sachen in Assembler gecodet. Nun will ich aber auf C umsteigen, da es mir auf dauer zu anstregned und umständlich wird (die Projekte werden immer größer). Da ich aber auf meine bisher geschriebenen Routinen nicht verzichten möchte suche ich jetzt eine möglichkeit, ohne viel aufwand meine bisher geschriebenen sachen in ein C-Header-File zu importieren. Mir schwebt so etwas vor wie dass ich die Funktion in einem Haderfile deklarire (in C) in welchem das Assamblerefile gealden wird und dass diese Funktion einfahc die Assamblerfunktion aufruft.
Beispiel:
Assamblerfunktion.inc
_irgendwas
mov bla
addwf blub
call _irgendwas2 ;ebenfalls in dem file-deklariert
return

C-Header:
#include assamblerfunktion.inc

void irgendwas(void)
{
"call _irgendwas"
return;
}

Is das möglich? und wenn ja wie?

Nebenfrage: Wie schreib ich in C was ins Workingregister?
ich hoffe jemand versteht was ich will und kann mir helfen
liebe Grüße Kante

robocat
05.12.2007, 09:46
wenn du avr-gcc verwendest, kannst du deine asm-files im makefile unter asm-quellen auflisten:

# List Assembler source files here.
# Make them always end in a capital .S. Files ending in a lowercase .s
# will not be considered source files but generated files (assembler
# output from the compiler), and will be deleted upon "make clean"!
# Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC = ... (hier die asm-quelltexte mit leerzeichen getrennt)
einzelne anweisungen gehen mit

asm("ldi R18,0xEC");

gruesse

oberallgeier
05.12.2007, 09:46
Da gibts doch den "inline Assembler"
https://www.roboternetz.de/wissen/index.php/Inline-Assembler_in_avr-gcc
aber so weit bin ICH noch nicht - habs noch nicht ausprobiert, aber ich stolpere dauernd über diese Codeschnippsel in den C-Beispielen.

kante23
05.12.2007, 12:56
Hy,
nein benutze MPLAB. Programmiere auch PICs un keine Avrs.
Das Problem mit den Inlines ist, dass ich nicht weis wie ich darin aufrufe von anderen Assemblerfunktionen realisieren soll.
mfg Kante

SprinterSB
05.12.2007, 21:27
=1=
es gibt unterschiedliche avr assembler dialekte
Wenn du inline assembler verwenden willst, muss dein code in gnu avr assembler geschriebwn sein (und nicht in atmel assembler, was bei dir offenbar der fall ist).

zum umwandeln geht
-a- umschreiben
-b- hex erstellen und mit avr-objdump disassemblieren (sind dann aber die ganzen schönen bezeichner weg, weil hex has nicht speichert)

=2=
wenn du nich assembler benutzen willst sondern binärdateien (objecs) dann muss
-a- das objektformat passen (zb elf32-avr)
-b- section infos etc stimmen
-c- das object darf *net* lokatiert sein, es bringt also nix, ein *.hex in ein *.o umzuwandeln.

=3=
Dein Code muss dem avr-gcc abi entsprechen, siehe

https://www.roboternetz.de/wissen/index.php/Avr-gcc/Interna#Registerverwendung

alternativ kannst nun wrapper (zb inline assembler oder assembler) schreiben, der als interface zwischen deiner assembler-abi und der avr-gcc abi dient

abi=application binary interface

oberallgeier
05.12.2007, 21:44
=1=
=2=
=3=Huiii - so viel, so klar - da macht ja das Lernen richtig Spass!


zum umwandeln geht
-a- umschreiben
-b- hex erstellen und mit avr-objdump disassemblieren... Kann man denn nicht erst -b- und dann mit dessen Hilfe danach -a- ?

Ich meine, ich bin noch nicht so weit, noch kämpfe ich mich durch meine Anfangsgründe "C" - aber mit AVR-Assembler bin ich vor drei Monaten in die µC-Thematik eingestiegen (vorbelastet mit 8086- und Z80-Assembler - na ja, das ist eigentlich schon alles vergessen). Aber das Thema interessiert schon, weil ich merke/lese, dass eben nicht ALLES in C zu gehen scheint.

uffi
30.12.2007, 16:46
ein schönes Beispiel, wie man Gnu Assembler Files als *.S in C einbindet, findet sich in der I2C Library von Peter Fleury, und zwar die Software- Implementierung des I2C Master, die an jedem AVR Pin auch ohne TWI Modul geht:

http://homepage.hispeed.ch/peterfleury/avr-software.html#libs