Forum: Mikrocontroller und Digitale Elektronik 8051 Assembler + Linker für WINDOWS 10/11


von Juergen B. (jbaben)


Lesenswert?

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.

von Harald K. (kirnbichler)


Lesenswert?

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/

von Mario M. (thelonging)


Lesenswert?

Sind in der function.asm wirklich Export-Direktiven? Sonst probiere doch 
mal, die Datei zu inkludieren oder einfach zusammenzukopieren.

von Juergen B. (jbaben)


Lesenswert?

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

von Juergen B. (jbaben)


Lesenswert?

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

von Harald K. (kirnbichler)


Lesenswert?

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.

von Mario M. (thelonging)


Lesenswert?

Sonst probiere doch mal das "Original".
https://www.microchip.com/en-us/development-tool/c51asm

von Michael B. (laberkopp)


Lesenswert?

Juergen B. schrieb:
> leider habe ich aber nur die Eval-Funktion mit der Einschränkung für den
> verwendet Code.

Gibts die noch ? Ich hörte, Keil 8051 wäre inzwischen free.

https://community.silabs.com/s/article/z-wave-500-do-i-have-to-pay-for-the-keil-compiler-x?language=en_US

Wahlweise

https://www.batronix.com/versand/software/uC51/c-compiler.html

von Thomas Z. (usbman)


Lesenswert?

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.

von Bernd N. (_bn_)


Lesenswert?

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

von Michael B. (laberkopp)


Lesenswert?

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.

von Bernd N. (_bn_)


Lesenswert?

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.

von Harald K. (kirnbichler)


Lesenswert?

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.

von Michael B. (laberkopp)


Lesenswert?

Harald K. schrieb:
> sofern da überhaupt irgendwelche Änderungen nötig sind

Du kennst dich mit Keil offenbar nicht aus.

von Mario M. (thelonging)


Lesenswert?

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.

von Peter L. (pelikan)


Angehängte Dateien:

Lesenswert?

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

von Motopick (motopick)


Lesenswert?

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.

von Harald K. (kirnbichler)


Lesenswert?

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.

von Bernd N. (_bn_)


Lesenswert?

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.

von Thomas Z. (usbman)


Lesenswert?

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.

: Bearbeitet durch User
von Bernd N. (_bn_)


Lesenswert?

Danke Thomas, mir war das nicht ganz klar aber deswegen hatte ich auch 
den reinen Assembler verlinkt. Siehe meine 1te Antwort.

von Juergen B. (jbaben)


Angehängte Dateien:

Lesenswert?

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

von Thomas Z. (usbman)


Lesenswert?

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.

: Bearbeitet durch User
von Bernd N. (_bn_)


Angehängte Dateien:

Lesenswert?

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.

von Bernd N. (_bn_)


Angehängte Dateien:

Lesenswert?

Anbei noch einmal der Link zum Assembler.
http://plit.de/asem-51/download.htm

von Juergen B. (jbaben)


Angehängte Dateien:

Lesenswert?

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

von Sebastian B. (sfreak) Benutzerseite


Angehängte Dateien:

Lesenswert?

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

von Thomas Z. (usbman)


Angehängte Dateien:

Lesenswert?

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

von Juergen B. (jbaben)


Lesenswert?

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

von Juergen B. (jbaben)


Lesenswert?

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

von Bernd N. (_bn_)


Lesenswert?

Hättest du dir meine Antwort angesehen dann hättest du es gesehen. Siehe 
.lst File. So hast du jetzt mehrere Lösungen.

von Thomas Z. (usbman)


Lesenswert?

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

von Motopick (motopick)


Lesenswert?

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.

von Juergen B. (jbaben)


Lesenswert?

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

von Juergen B. (jbaben)


Lesenswert?

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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.