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/
Sind in der function.asm wirklich Export-Direktiven? Sonst probiere doch
mal, die Datei zu inkludieren oder einfach zusammenzukopieren.
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.html
http://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.
Harald K. schrieb:
> sofern da überhaupt irgendwelche Änderungen nötig sind
Du kennst dich mit Keil offenbar nicht aus.
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 | sbit DIGIT_1 = P1^1;
| 6 | sbit DIGIT_2 = P1^5;
| 7 | sbit DIGIT_3 = P1^4;
| 8 | sbit DIGIT_4 = P1^3;
| 9 | sbit Trigger = 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 | void Timer2_ISR(void) interrupt 5
| 20 | #else
| 21 | void Timer2_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.
Danke Thomas, mir war das nicht ganz klar aber deswegen hatte ich auch
den reinen Assembler verlinkt. Siehe meine 1te Antwort.
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.
Anbei noch einmal der Link zum Assembler.
http://plit.de/asem-51/download.htm
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: 1 | ******************************************************************************
| 2 | * RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED: 0A5BH BYTE (129%) *
| 3 | ******************************************************************************
| 4 | Program Size: data=8.0 xdata=0 code=2903
| 5 | LINK/LOCATE RUN COMPLETE. 1 WARNING(S), 0 ERROR(S)
| 6 | *** WARNING L5: CODE SPACE MEMORY OVERLAP
| 7 | FROM: 0000H
| 8 | TO: 041EH
| 9 | *** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED
| 10 | MODULE: .\Objects\hektar_main.obj (-----)
| 11 | LIMIT: 0800H BYTES
| 12 | Target not created.
| 13 | Build Time Elapsed: 00:00:00
|
Anbei das komplette Projekt
Juergen
Also der c51asm
(https://www.microchip.com/en-us/development-tool/c51asm) übersetzt das
ganze ohne Murren:
1 | >c51asm -l hektar_main.lst hektar_main.a51
| 2 | C51ASM: advanced C51 macro assembler Version 1.2 (31 May 2011)
| 3 | Copyright (C) 2011 Atmel Corp.
| 4 |
| 5 |
| 6 | Pass 1 completed with no warnings and no errors
| 7 |
| 8 | Pass 2 completed with no warnings and no errors
| 9 |
| 10 | Segment usage:
| 11 | Code : 1596 bytes
| 12 | Data : 0 bytes
| 13 | Idata : 0 bytes
| 14 | Edata : 0 bytes
| 15 | Fdata : 0 bytes
| 16 | Xdata : 0 bytes
| 17 | Bit : 0 bits
| 18 |
| 19 | Register banks used: ---
| 20 |
| 21 | Warnings: 0
| 22 | Errors: 0
|
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
Sebastian B. schrieb:
> Also der c51asm
> (https://www.microchip.com/en-us/development-tool/c51asm) übersetzt das
> ganze ohne Murren:
> 1 | >>c51asm -l hektar_main.lst hektar_main.a51
| 2 | > C51ASM: advanced C51 macro assembler Version 1.2 (31 May 2011)
| 3 | > Copyright (C) 2011 Atmel Corp.
| 4 | > Pass 1 completed with no warnings and no errors
| 5 |
| 6 | > Pass 2 completed with no warnings and no errors
| 7 | > Segment usage:
| 8 | > Code : 1596 bytes
| 9 | > Data : 0 bytes
| 10 | > Idata : 0 bytes
| 11 | > Edata : 0 bytes
| 12 | > Fdata : 0 bytes
| 13 | > Xdata : 0 bytes
| 14 | > Bit : 0 bits
| 15 | > Register banks used: ---
| 16 | > Warnings: 0
| 17 | > Errors: 0
| 18 | >
|
Vielen Dank für den Hinweis, muss ich noch den Test machen.
Juergen
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
Hättest du dir meine Antwort angesehen dann hättest du es gesehen. Siehe
.lst File. So hast du jetzt mehrere Lösungen.
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
Mit Intels MCS51 geht es natuerlich auch.
1 | >msdos asm51 hektar_main.a51
| 2 |
| 3 | DOS 7.10 (038-N) MCS-51 MACRO ASSEMBLER, V2.2
| 4 | Copyright 1979, 1983, 1986 Intel Corporation
| 5 |
| 6 | ASSEMBLY COMPLETE, NO ERRORS FOUND
| 7 |
| 8 | >msdos oh HEKTAR_MAIN.OBJ
| 9 |
| 10 | DOS 7.10 (038-N) OH V1.0
| 11 | Copyright 1986 Intel Corporation
|
Und, es kommt sogar ein Hexfile heraus.
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
Sebastian B. schrieb:
> Also der c51asm
> (https://www.microchip.com/en-us/development-tool/c51asm) übersetzt das
> ganze ohne Murren:
> 1 | >>c51asm -l hektar_main.lst hektar_main.a51
| 2 | >
|
Hallo,
habe nun auch meinem Assembler-Code mit "c51asm" compiliert --> OK
Vielen Dank für Deinen Hinweis.
Juergen
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|