8051 Assembler + Linker für WINDOWS 10/11

OP #7748754
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.

OP #7748811
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

OP #7748843
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

#7748896
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

#7748912
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.

#7748936
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.

#7749045
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.

#7749189
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.

#7749267
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.

#7749289
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.

OP #7749363
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

Angehängte Dateien:
#7749399
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.

#7749422
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.

Angehängte Dateien:
OP #7749440
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

Angehängte Dateien:
Persönliche Seite #7749457
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
Angehängte Dateien:
OP #7749473
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

7
> Pass 2 completed with no warnings and no errors
8
> Segment usage:
9
>    Code      :   1596 bytes
10
>    Data      :      0 bytes
11
>    Idata     :      0 bytes
12
>    Edata     :      0 bytes
13
>    Fdata     :      0 bytes
14
>    Xdata     :      0 bytes
15
>    Bit       :      0 bits
16
>    Register banks used: ---
17
>    Warnings: 0
18
>    Errors:   0
19
>

Vielen Dank für den Hinweis, muss ich noch den Test machen. Juergen

OP #7749477
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

#7749533
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.

OP #7750028
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren