Guten Tag,
ich suche einen Assembler + Linker für die Mikrocontroller der
Atmel-Familie (AT89C51, AT89S51/52). OS = WINDOWS 10/11.
Ich möchte zwei Assembler-Dateien zusammenfügen (main.asm +
function.asm).
Ich habe dafür Keil-C verwendet, leider habe ich aber nur die
Eval-Funktion mit der Einschränkung für den verwendet Code.
Kann mir jemand dazu einen Assembler nennen ?
Juergen B.
Juergen B. schrieb:> Ich habe dafür Keil-C verwendet, leider habe ich aber nur die> Eval-Funktion mit der Einschränkung für den verwendet Code.
Wenn Du nur deswegen einen Assembler verwenden willst, weil Deine
Keil-C-Version kastriert ist - sieh Dir mal sdcc an.
https://sdcc.sourceforge.net/
Mario M. schrieb:> Sind in der function.asm wirklich Export-Direktiven? Sonst probiere doch> mal, die Datei zu inkludieren oder einfach zusammenzukopieren.
Hallo,
main.asm ist das Hauptprogramm und die Datei "function.asm" enthält die
benötigten Funktionen (z.B. Wartezeit, Rechenprogramme usw.) für das
Hauptprogramm und wird mit "$INCLUDE (function.asm) hinzugefügt.
Das Problem mit Keil-C ist die Eval-Version, d.h mein Programm-Code ist
zu groß für den Assembler (A51).
Juergen
Harald K. schrieb:> Juergen B. schrieb:>> Ich habe dafür Keil-C verwendet, leider habe ich aber nur die>> Eval-Funktion mit der Einschränkung für den verwendet Code.>> Wenn Du nur deswegen einen Assembler verwenden willst, weil Deine> Keil-C-Version kastriert ist - sieh Dir mal sdcc an.>> https://sdcc.sourceforge.net/
Hallo,
vielen Dank für den Hinweis auf "SDCC".
Ich kenne zwar "SDCC" habe aber nur an C-Compiler gedacht.
Werde nun den Assembler ausprobieren.
Könnte so mein "Makefile" aussehen: ?
1
REM Makefile fuer: main.hex
2
sdas8051 -o main.obj main.asm
3
sdas8051 -o function.obj function.asm
4
sdld -i main.obj function.obj
Leider nicht, bei "sdas8051 -o function.obj function.asm"
wird nur ein Null-File "function.obj ohne Fehlermeldung erzeugt.
Juergen
Nun, mit den anderen Kommandozeilenoptionen von sdas solltest Du
rausfinden können, was da schiefläuft.
Nicht jeder Assembler verwendet die gleiche Syntax, auch wenn der für
die gleiche Zielmaschine ist.
Juergen B. schrieb:> Leider nicht, bei "sdas8051 -o function.obj function.asm"> wird nur ein Null-File "function.obj ohne Fehlermeldung erzeugt.
nun ja wenn das file bisher mit include eingebunden war ist der ASM code
sicher nicht getrennt übersetzbar. Zusätzlich unterscheiden sich die
Pseudo Befehle.
Juergen B. schrieb:> Guten Tag,> ich suche einen Assembler + Linker für die Mikrocontroller der> Atmel-Familie (AT89C51, AT89S51/52). OS = WINDOWS 10/11.> Ich möchte zwei Assembler-Dateien zusammenfügen (main.asm +> function.asm).> Ich habe dafür Keil-C verwendet, leider habe ich aber nur die> Eval-Funktion mit der Einschränkung für den verwendet Code.>> Kann mir jemand dazu einen Assembler nennen ?>> Juergen B.
Die beiden *.asm dateien sind also 'C Code' übersetzt nach asm mittels
Keil und nun möchtest du beides linken? das einfachste wird sein die
beiden C dateien mittels SDCC zu übersetzen bzw. irgendein anderer
freier C Compiler. In der Tat gibt es den Keil auch kostenlos bei
Verwendung von Silabs derivaten. Ein leichtes damit auch einen Atmel zu
übersetzen.
https://www.batronix.com/versand/software/uC51/c-compiler.htmlhttp://www.opcube.com/home.html#MIDE51
Reinen Assembler gibt es hier:
http://plit.de/asem-51/download.htm
Bernd N. schrieb:> Die beiden *.asm dateien sind also 'C Code' übersetzt nach asm mittels> Keil und nun möchtest du beides linken? das einfachste wird sein die> beiden C dateien mittels SDCC zu übersetzen bzw. irgendein anderer> freier C Compiler
Und dazu das ganze C-Programm von der Nomenklatur von Keil umzuschreiben
?
You must be kidding. Typischer Fall von Gequassel ohne Kenntnisse.
Michael B. schrieb:> Bernd N. schrieb:>> Die beiden *.asm dateien sind also 'C Code' übersetzt nach asm mittels>> Keil und nun möchtest du beides linken? das einfachste wird sein die>> beiden C dateien mittels SDCC zu übersetzen bzw. irgendein anderer>> freier C Compiler>> Und dazu das ganze C-Programm von der Nomenklatur von Keil umzuschreiben> ?>> You must be kidding. Typischer Fall von Gequassel ohne Kenntnisse.
Du machst deinem Namen alle Ehre. Für mich easy da ich mich in beiden
Welten sehr gut auskenne. Nicht mehr als eine kleine Fingerübung.
Michael B. schrieb:> Und dazu das ganze C-Programm von der Nomenklatur von Keil umzuschreiben> ?
Es dürfte erheblich weniger Aufwand sein, ein C-Programm von einem auf
einen anderen C-Compiler zu übertragen (sofern da überhaupt
irgendwelche Änderungen nötig sind) als einen Assemblerquelltext von
einem auf einen anderen Assembler anzupassen, selbst wenn das für exakt
die gleiche Zielhardware ist.
Jungs! Der TO hat keinen C-Quelltext und somit keinen Bedarf für einen
Compiler.
Juergen B. schrieb:> Ich kenne zwar "SDCC" habe aber nur an C-Compiler gedacht.> Werde nun den Assembler ausprobieren.
Hallo Jürgen,
probiere mal meinen Assembler.
Die main.asm umbenennen in main.mac, assemblieren und dann sollte eine
main.bin rauskommen.
Oder magst du die Dateinen einstellen oder versenden?
VG
Peter
Bernd N. schrieb:> Die beiden *.asm dateien sind also 'C Code' übersetzt nach asm mittels> Keil und nun möchtest du beides linken? ...Sehr unwahrscheinlich.
Ein C-Compiler haette wohl kaum ein Include eingefuegt, sondern
ganz einfach aus 2 Quellfiles genau 2 Objektfiles erzeugt, und die
dann gelinkt. Mit der Logik habt ihr es wohl alle nicht so.
Ansonsten gibt es ja noch Intels Makroassembler MCS51.
Motopick schrieb:> Ein C-Compiler haette wohl kaum ein Include eingefuegt, sondern> ganz einfach aus 2 Quellfiles genau 2 Objektfiles erzeugt, und die> dann gelinkt.
Ein klassischer C-Compiler erzeugt aus einem C-Source-File ein
Assemblerfile. Für den Rest sind andere zuständig.
Juergen B. schrieb:> Ich möchte zwei Assembler-Dateien zusammenfügen (main.asm +> function.asm).> Ich habe dafür Keil-C verwendet, leider habe ich aber nur die> Eval-Funktion mit der Einschränkung für den verwendet Code.>> Kann mir jemand dazu einen Assembler nennen ?>> Juergen B.
@ von Motopick
Die Frage war eben so gestellt, siehe Oben, also nimmt man den Faden
irgendwo auf. Hier im Forum scheint das den 'Aufreger der Woche' zu
geben.
Die Aufgabe ist einfach. Der Quellcode soll auf beiden Compilern
funktionieren und fertig. Das ist eine kleine Übung, nicht mehr und
nicht weniger.
Die wesentlichen Unterschiede zwischen Keil und SDCC sind die Bezeichner
für GPIOs sowie Interrupt handling.
Sofern der Quellcode nicht geheim ist kann ich das gerne Vorturnen.
Beispiel Pseudocode:
1
#define KeilisInUse false
2
3
// 7Segment Segmente
4
#if (KeilisInUse)
5
sbitDIGIT_1=P1^1;
6
sbitDIGIT_2=P1^5;
7
sbitDIGIT_3=P1^4;
8
sbitDIGIT_4=P1^3;
9
sbitTrigger=P0^2;
10
#else
11
#define DIGIT_1 P1_1
12
#define DIGIT_2 P1_5
13
#define DIGIT_3 P1_4
14
#define DIGIT_4 P1_3
15
#define Trigger P0_2
16
#endif
17
18
#if (KeilisInUse)
19
voidTimer2_ISR(void)interrupt5
20
#else
21
voidTimer2_ISR(void)__interrupt(5)
22
#endif
23
{
24
IsrCounter++;
25
....
Sollte sich der Code hier einfinden dann mache ich das gerne für den TO.
Bernd ich gebe dir im wesentlichen recht. Keil C51 code kann man mit
wenig Aufwand so schreiben dass er auch mit SDCC übersetzt werden kann.
Ich habe für mich Makros geschrieben die die meisten Unterschiede
auflösen.
Die andere Richtung SDCC code nach Keil ist aufwendiger. da SDCC auch
lokal definierte Variablen zuläßt. Keil erlaubt nur Variablen am
Funktionsanfang.
Das ist aber hier gar nicht der Punkt. Der TO hat in Assembler
programmiert und nur die uVision IDE dazu benutzt. Kein C nach ASM das
erlaubt die Trial gar nicht. Deswegen auch die include function.asm.
Edit:
Das Problem würde sich gar nicht stellen wenn der TO ein älteres uVision
verwenden würde. In uV3 können absolute ASM Programme beliebig groß
sein, da der linker dann nicht aufgerufen wird. BL51 macht die
Begrenzung auf 2k.
Hallo,
ersteinmal vielen Dank für Eure Hinweise.
Das war natürlich nicht meine Absicht für den Aufreger der Woche zu
sorgen.
Die genannten Assembler werde ich mir noch anschauen.
Ich verwende auch C-Programme, z.B. die "main.asm" gibt es auch als
"main.c"
Der Original-Assembler war "ASM51" von ca. 1990.
Original MC war: "80535/537" + 8032 von Siemens.
Für Bernd N. füge ich die beiden Assembler-Dateien bei (wenn nicht zu
aufwendig).
Juergen
Jürgen ich verstehe dein Problem nicht so ganz. Der code ist < 0x800 und
kann problemlos mit Keil A51 übersetzt werden.
In function.main muss das end raus und main.asm muss am ende ein
#include "function.main" eingefügt werden
$include (function.main) geht auch
Was genau geht bei dir nicht. Dein function.main ist jedenfalls nicht
linkfähig.
Juergen B. schrieb:> Hallo,> ersteinmal vielen Dank für Eure Hinweise.> Das war natürlich nicht meine Absicht für den Aufreger der Woche zu> sorgen.> Die genannten Assembler werde ich mir noch anschauen.> Ich verwende auch C-Programme, z.B. die "main.asm" gibt es auch als> "main.c"> Der Original-Assembler war "ASM51" von ca. 1990.> Original MC war: "80535/537" + 8032 von Siemens.>> Für Bernd N. füge ich die beiden Assembler-Dateien bei (wenn nicht zu> aufwendig).>> Juergen
Die C Dateien hatte ich eigentlich erwartet so du denn mein Angebot
gelesen hast!?
Wie dem auch sei, Thomas Z. hat dir bereits geantwortet. Ich habe das
mal für dich getan, die Dateien im Anhang. Es compiliert ohne Probleme
mit dem von mir bereits verlinketen Assembler.
Thomas Z. schrieb:> Jürgen ich verstehe dein Problem nicht so ganz. Der code ist < 0x800 und> kann problemlos mit Keil A51 übersetzt werden.>> In function.main muss das end raus und main.asm muss am ende ein> #include "function.main" eingefügt werden> $include (function.main) geht auch>> Was genau geht bei dir nicht. Dein function.main ist jedenfalls nicht> linkfähig.
Hallo,
mit der Keil Version uVision V5.38.0.0 erhalte ich die Meldung:
Juergen B. schrieb:> mit der Keil Version uVision V5.38.0.0 erhalte ich die Meldung:
naja so wie du das machst geht es natürlich nicht.
Ich hab dein projekt mal abgeändert
Thomas Z. schrieb:> Juergen B. schrieb:>> mit der Keil Version uVision V5.38.0.0 erhalte ich die Meldung:>> naja so wie du das machst geht es natürlich nicht.> Ich hab dein projekt mal abgeändert
Vielen Dank für Deine Hilfe und den entscheidenen Hinweis.
Gut das ich entsprechend gefragt habe.
Wenn man weiß wie es geht ist alles einfacher.
Ohne Hilfe wäre ich da nicht drauf gekommen.
Die Lösung ist:
1
Die Funktions-Datei ($INCLUDE (funktion.a51)) muss unterhalb der Main-Datei eingefügt werden und nicht wie bei mir beide Dateien in "Source Group 1"
Juergen B. schrieb:> und nicht wie bei mir beide Dateien in "Source Group 1"
Das wäre schon gegangen wenn du linkfähigen code hättest.
Stichwort dazu: PUBLIC und EXTRN da spuckt die Keil Hilfe dann auch was
aus. Vermutlich hast du noch nie mit einer ASM/LINK Combo gearbeitet
Bernd N. schrieb:> Hättest du dir meine Antwort angesehen dann hättest du es gesehen. Siehe> .lst File. So hast du jetzt mehrere Lösungen.
Hallo,
Deine und alle Antworten habe ich just in Time gelsen, natürlich konnte
ich nicht alle Hinweise "just in Time" ausführen.
Ich habe nun meine beiden Dateien mit dem Assembler ASEM-51 (asemx.exe)
über die IDE's MIDE-51 bzw. MC-51 compilieren können (datei.hex).
Vielen Dank für Deine Hilfe.
Mehrere Lösungen zu haben ist meiner Ansicht OK, mal passt die eine, mal
die andere Lösung.
Juergen