Forum: PC-Programmierung C Programm für MS DOS compilieren


von Elias B. (bouni)


Lesenswert?

Hallo zusammen,

ich hab ein kleines C-Programm geschrieben das eine Binärdatei 
verändern/anpassen soll.
Leider liegt die Datei auf einem DOS Rechner und wenn möglich möchte ich 
das Programm auch dort ausführen und nicht jedesmal die Datei auf ein 
32Bit System kopieren.
Denn da liegt mein Problem, das kompilieren für ein 32Bit System klappt 
wunderbar, aber ich bekomm es nicht hin ein 16Bit Binary zu erzeugen.

Der Digital Mars C Compiler[0] sollte das laut deren Webseite können, 
aber ich bin wohl zu blöd dazu das hinzubekommen.

Kann mir jemand sagen was ich tun muss um ein DOS Program zu erzeugen?

Besten Dank im Voraus

P.S. Das Programm ist wirklich winzig und ich verwende nur die <stdio.h>

[0]http://www.digitalmars.com/

von Peter II (Gast)


Lesenswert?

google liefert

http://personal.ee.surrey.ac.uk/Personal/R.Bowden/C/dos-gcc/

keine ahnung ob die links gehen.

von Elias B. (bouni)


Lesenswert?

Hi Peter,

werd das mal versuchen.
Dachte eigentlich eher an ein Cross-Compiler, aber wenns nicht anderst 
geht werd ich eben auf der DOS-Möhre compilieren :/

von Peter II (Gast)


Lesenswert?

Elias B. schrieb:
> Hi Peter,
>
> werd das mal versuchen.
> Dachte eigentlich eher an ein Cross-Compiler, aber wenns nicht anderst
> geht werd ich eben auf der DOS-Möhre compilieren :/

der compiler sollte auch unter Win7 in einer DoxBox laufen. Dann kannst 
du auch dort compilieren

von micha (Gast)


Lesenswert?

Du könntest auch OpenWatcom 
(http://www.openwatcom.org/index.php/Main_Page) oder TurboC 
(http://edn.embarcadero.com/article/20841) versuchen...

von Elias B. (bouni)


Lesenswert?

Hi,

ich hab mehr oder weniger erfolg gehabt.
Virtual Box + DJGPP's GCC haben mir eine exe gebaut die unter DOS läuft.

Leider nur auf der Virtualbox wo ich's gebaut hab.
Auf der anderen bekomm ich "Load error: no DPMI - Get csdpmi*.zip"

Das Zip war Teil der Installation für den GCC von hier:
http://personal.ee.surrey.ac.uk/Personal/R.Bowden/C/dos-gcc/

Kann mir jemand sagen wie ich das so compilieren kannd amit das auch 
läuft wenn das Zip file nicht rum ist?

Danke schon mal!

von Uwe2 (Gast)


Lesenswert?

DPMI = Dos Protected Mode Interface
http://de.wikipedia.org/wiki/DOS_Protected_Mode_Interface

von Thoms (Gast)


Lesenswert?

Du hast doch beim DJGPP einen DPMI-Extender dabei: CWSDPMI

von Elias B. (bouni)


Lesenswert?

Ja schon, aber ich will nur ne kleine exe die man auf den Zielrechner 
kopieren kann um sie dann dort zu benutzen.

Ohne das man da noch so ein leidigen Extender installieren muss.

von Reinhard Kern (Gast)


Lesenswert?

Elias B. schrieb:
> Ja schon, aber ich will nur ne kleine exe die man auf den Zielrechner
> kopieren kann um sie dann dort zu benutzen.

Dann besorgst du dir am besten einen echten DOS-Compiler wie Turbo-C, 
die gibts sogar umsonst. Da die Compiler auch nur Konsolenprogramme sind 
oder bestenfalls ANSII-Grafik benutzen, sollten sie auch unter Windows 
laufen, notfalls mit Hilfe von DosBox (dem Programm, nicht der 
Eingabeaufforderung).

Ich habe mir mal vorsichtshalber bei Borland ein Turbo-C 2.01 von 1989 
runtergeladen, und Borland C mit 1m Handbuch und auf ca. 30 Disketten 
hatte ich auch mal, aber die habe ich glaube ich entsorgt.

Gruss Reinhard

von Elias B. (bouni)


Lesenswert?

Hi,

hab den Borland C Compiler 2.01 heruntergeladen und installiert.
Leider bekomm ich einen haufen Fehler wenn ich compilieren will :/

Weisst du welchen C Standart damals benutzt wurde, bzw wo man handbüch 
herbekommen könnte?

von Thoms (Gast)


Lesenswert?

> Ohne das man da noch so ein leidigen Extender installieren muss.

Das ist doch auch nur eine .exe

von Reinhard Kern (Gast)


Lesenswert?

Elias B. schrieb:
> Weisst du welchen C Standart damals benutzt wurde, bzw wo man handbüch
> herbekommen könnte?

Such mal nach Kernighan & Ritchie, dem Urahn aller C-Bücher. Da steht 
sicher nichts zu Modernes drin.

Bei Google gefunden:
http://de.scribd.com/doc/35398818/Turbo-C-Users-Guide-1987

Gruss Reinhard

von Peter II (Gast)


Lesenswert?

Elias B. schrieb:
> Leider bekomm ich einen haufen Fehler wenn ich compilieren will :/

zeig doch mal ein paar der melden. Vermutlich sind nicht alles variablen 
als erstes in der funktion deklariert.

von Mr. X (Gast)


Lesenswert?

Elias B. schrieb:
> Weisst du welchen C Standart damals benutzt wurde. ...

Einer mit einem weiche "t" ;-)

von amateur (Gast)


Lesenswert?

@Elias

Ich habe bei mir "D-Fend Reloaded" laufen (Fenster 7).
Ein paar olle 16-Bit-Clipperanwendungen joggen da problemlos.

Warum nicht ein betagter C-Compiler?

Dazu installierst Du dir noch 'nen Notepad++-Editor oder was ähnliches 
und so kannst Du halbwegs komfortabel, unter Fenster, arbeiten. Die 
meisten Compiler sind ja sowieso Kommandozeilenorientiert.

von Wilhelm F. (Gast)


Lesenswert?

Irgend einen Uralt-Compiler, und den unter DOSbox laufen lassen.

So bekam ich vor kurzem meinen Uralt-Assembler mit Simulator von 1991 
auch wieder zum laufen. Gestern noch einen neuen 8048-Simulator mit 
Assembler für meine über 30 Jahre alten Retro-Bausteine. Alles auf 
meinem Vista-Notebook.

Bei einem alten Turbo-C-Compiler gab es ein Einstellungsmenü. Darin 
konnte man einstellen, ob das Programm auf einem 8086 oder 80286 oder 
80386 laufen sollte, und ob mit oder ohne Coprozessor. Die Coprozessoren 
hießen immer xx87.

von amateur (Gast)


Lesenswert?

@Elias

>Leider bekomm ich einen haufen Fehler wenn ich compilieren will

Das was heute vor dem Anwender versteckt wird, musst Du meist zu Fuß 
erledigen.
So ein Compiler benötigt einen ganzen Sack voll Umgebungsvariablen um 
sich im System auszukennen.
So zum Bleistift: Wo sind die Bibliotheken, wo sind die 
Standart-Header-Files?
Früher hat man das in eine Batch-Datei gepackt, die einmalig aufgerufen 
wurde oder im Systemautomatismus versteckt war.
Also jede Menge: SET …

von (prx) A. K. (prx)


Lesenswert?

Elias B. schrieb:
> Der Digital Mars C Compiler[0] sollte das laut deren Webseite können,
> aber ich bin wohl zu blöd dazu das hinzubekommen.

dmc -msd program.c

von (prx) A. K. (prx)


Lesenswert?

amateur schrieb:
> So ein Compiler benötigt einen ganzen Sack voll Umgebungsvariablen um
> sich im System auszukennen.

Setzt DMC alles selber, ausgehend von seinem EXE-Pfad.

von amateur (Gast)


Lesenswert?

@Elias

An der Stelle, an der Du z.B. "dmc -msd program.c" eingeben würdest, 
einfach mal den Befehl "set" eingeben. Dann werden die aktuellen 
Einstellungen ausgegeben.

von (prx) A. K. (prx)


Lesenswert?

Wenn DMC nicht schon im Pfad drin ist, dann in der Kommandozeile vorher:
  path c:\dm\bin;%path%
Mal angenommen, dass du den Kram nach c:\dm entpackt hast. Mehr ist 
eigentlich nicht nötig.

von Michael L. (Gast)


Lesenswert?

Hallo Elias,

probier es mal mit TURBO C++ V. 1.01
http://edn.embarcadero.com/museum/antiquesoftware

Ob Du es unter Win7/8 noch zum Laufen bekommst, weiß ich nicht. Aber für 
Windows XP sollte es noch funktionieren. Im Zweifel kannst Du ja auch 
den Quelltext Deines Mini-Programms posten, und jemand aus dem Forum 
versucht, es zu kompilieren.


Viele Grüße
Michael

von Turbo (Gast)


Lesenswert?

Elias B. schrieb:
> Leider bekomm ich einen haufen Fehler wenn ich compilieren will

Welche Fehler bekommst du denn?

von Brater (Gast)


Lesenswert?

Zäumen wir das Pferd mal von hinten auf: warum nicht eine andere 
DOS-Version verwenden? :P
Bootdiskette mit z.B. Freedos und einem passenden Extender (siehe auch 
Wikipedia zu FreeDOS)...
Sofern der Rechner von CD booten kann, kannst du auch alles auf eine 
CD-RW kloppen.

von Adler (Gast)


Lesenswert?

Michael Lenz (hochbett) schrieb:

> Hallo Elias,

> probier es mal mit TURBO C++ V. 1.01
> http://edn.embarcadero.com/museum/antiquesoftware

Die rücken doch nichts raus ohne Registrierung (nicht mal 
Uralt-Software). Wahrscheinlich geben sie in 100 Jahren mal TC 3.0 frei.

Man findet im Netz zwar grundsätzlich alles wonach man zeitaufwändig 
sucht, aber leider meistens aus unseriösen Quellen, die einem erst mal 
eine unbekannte EXE zum Dl anbieten. Vorsicht Virenschleuder!

Aber schau mal hier

http://www.retroarchive.org/dos/lang/index.html

von (prx) A. K. (prx)


Lesenswert?

Adler schrieb:
> Die rücken doch nichts raus ohne Registrierung (nicht mal
> Uralt-Software). Wahrscheinlich geben sie in 100 Jahren mal TC 3.0 frei.

Vielleicht hat der eine oder andere die Floppies noch nicht entsorgt. 
Dann verlagert sich das Problem darauf, 5,25" Floppies zu lesen. ;-)

von Adler (Gast)


Lesenswert?

A. K. (prx) schrieb:

Adler schrieb:
>> Die rücken doch nichts raus ohne Registrierung (nicht mal
>> Uralt-Software). Wahrscheinlich geben sie in 100 Jahren mal TC 3.0 frei.

> Vielleicht hat der eine oder andere die Floppies noch nicht entsorgt.
> Dann verlagert sich das Problem darauf, 5,25" Floppies zu lesen. ;-)

Also mein Borland Turbo C++ 3.0 ist auf 3,5" Diskette (wo hab ich die 
verdammten Dinger eigentlich??). Das 5,25" kann also beruhigt weiter in 
der Ablage vor sich stauben. ;-)

Die alten Versionen zu installieren kann dennoch etwas hakelig sein. Ich 
meine aber alles in ein Verzeichnis kopiert (Disk1) sollte es gehen. 
Oder man nimmt einfach seinen alten TC Ordner (der irgendwo auf einer 
Uralt-CD gezippt archiviert wurde anno irgendwann) und probierts damit 
in der DOS-Box. Dann braucht man nix groß zu installieren.

Wobei du doch weiter oben selber geschrieben hast, wie es mit dem DMC 
auch klappen sollte.

von AntiGier (Gast)


Lesenswert?

Adler schrieb:
> Die rücken doch nichts raus ohne Registrierung (nicht mal
> Uralt-Software).

Ja und, die Registrierung ist kostenfrei. Und einem geschenkten Gaul ...

von Elias B. (bouni)


Lesenswert?

Guten Morgen,

also Danke erst mal für die Zahlreichen Antworten!

das ist der code:
1
#include <stdio.h>
2
3
int main() {
4
    
5
    FILE *file;
6
    unsigned int day        = 0;
7
    unsigned int month      = 0; 
8
    unsigned int year       = 0;
9
    unsigned char answer    = 0;
10
        
11
    // Veruschen das BIN.CUT File zu oeffnen
12
    file = fopen("BIN.CUT","r+b");
13
    if(!file) {
14
        file = fopen("C:\\DATA\\BIN.CUT","r+b");
15
    }
16
    if(!file) {
17
        fprintf(stderr, "Fehler: BIN.CUT kann nicht geoeffnet werden!\n");
18
        return 1;
19
    }
20
    
21
    // Die ersten 18 Bytes ueberspringen
22
    fseek(file, 18 , SEEK_SET);
23
    
24
    // Das momentan gesetzte Datum lesen
25
    day = fgetc(file) | (fgetc(file) << 8);
26
    month = fgetc(file) | (fgetc(file) << 8);
27
    year = fgetc(file) | (fgetc(file) << 8);
28
    
29
    printf("Das Datum steht momentan auf %d.%d.%d\n",day,month,year);
30
    
31
    // Pruefen ob der Timer bereits aktiviert wurde
32
    if((fgetc(file) | (fgetc(file) << 8)) == 1) {
33
        printf("Der Timer ist bereits aktiv.\n\n");
34
    }
35
    else {
36
        printf("Der Timer ist noch nicht aktiviert worden.\n\n");
37
    }
38
    
39
    printf("Datum mit dem 01.01.2100 ueberschreiben? [j/n]: ");
40
    scanf("%c",&answer);
41
    if(answer != 0x6A && answer != 0x4A) {
42
        return 1;
43
    }
44
    
45
    // Die ersten 18 Bytes ueberspringen
46
    fseek(file, 18 , SEEK_SET);
47
    
48
    // Tag 1 eintragen
49
    fputc(0x01, file);
50
    fputc(0x00, file);
51
    // Monat 1 eintragen
52
    fputc(0x01, file);
53
    fputc(0x00, file);
54
    // Jahr 2100 eintragen
55
    fputc((0x0834 & 0xff), file);
56
    fputc(((0x0834 >> 8) & 0xff), file);
57
    // Den Timer deaktivieren
58
    fputc(0x00, file);
59
    fputc(0x00, file);
60
    
61
    // Die ersten 18 Bytes ueberspringen
62
    fseek(file, 18 , SEEK_SET);
63
    
64
    // Das momentan gesetzte Datum lesen
65
    day = fgetc(file) | (fgetc(file) << 8);
66
    month = fgetc(file) | (fgetc(file) << 8);
67
    year = fgetc(file) | (fgetc(file) << 8);
68
    
69
    printf("\nDer Timer steht jetzt auf %d.%d.%d\n",day,month,year);
70
    
71
    // Pruefen ob der Timer bereits aktiviert wurde
72
    if((fgetc(file) | (fgetc(file) << 8)) == 1) {
73
        printf("Der Timer ist immer noch aktiv.\n");
74
    }
75
    else {
76
        printf("Der Timer ist deaktiviert worden.\n");
77
    }
78
    return 0;
79
}

und das der output com Borland Compiler:
1
Turbo C  Version 2.01  Copyright (c) 1987, 1988 Borland International
2
BIN.C:
3
Error BIN.C 5: Undefined symbol 'FILE' in function main
4
Error BIN.C 5: Undefined symbol 'file' in function main
5
Warning BIN.C 5: Code has no effect in function main
6
Error BIN.C 6: Expression syntax in function main
7
Error BIN.C 7: Expression syntax in function main
8
Error BIN.C 8: Expression syntax in function main
9
Error BIN.C 9: Expression syntax in function main
10
Error BIN.C 11: Expression syntax in function main
11
Error BIN.C 17: Undefined symbol 'stderr' in function main
12
Error BIN.C 21: Expression syntax in function main
13
Error BIN.C 24: Expression syntax in function main
14
Error BIN.C 26: Undefined symbol 'month' in function main
15
Error BIN.C 27: Undefined symbol 'year' in function main
16
Error BIN.C 29: Undefined symbol 'day' in function main
17
Error BIN.C 31: Expression syntax in function main
18
Error BIN.C 40: Undefined symbol 'answer' in function main
19
Error BIN.C 45: Expression syntax in function main
20
Error BIN.C 48: Expression syntax in function main
21
Error BIN.C 51: Expression syntax in function main
22
Error BIN.C 54: Expression syntax in function main
23
Error BIN.C 57: Expression syntax in function main
24
Error BIN.C 61: Expression syntax in function main
25
Error BIN.C 64: Expression syntax in function main
26
Error BIN.C 71: Expression syntax in function main
27
*** 23 errors in Compile ***
28
29
30
        Available memory 386810

Vielleicht wird ja einer schlau draus !?

von (prx) A. K. (prx)


Lesenswert?

Problemlos (-v2 damit du auch was davon siehst):
1
[D:\Temp]dmc -v2 -msd f1.c
2
scppn -v2 -msd f1.c
3
Digital Mars C/C++ Compiler Version 8.33.13n
4
Copyright (C) Digital Mars 2000-2003.  All Rights Reserved.
5
Written by Walter Bright
6
www.digitalmars.com
7
 'f1.c'
8
  'c:\dm\include\stdio.h'
9
main
10
C/C++ Compiler complete. Code: 0x0226 (550) Data: 0x015a (346) Time: 0.00 seconds
11
12
link f1/noi;

XP, also ausführbar:
1
[D:\Temp]f1
2
Fehler: BIN.CUT kann nicht geoeffnet werden!

von (prx) A. K. (prx)


Lesenswert?

Offensichtlich ignoriert dein Turbo-C das Include-Statement, oder kriegt 
ein effektiv leeres stdio.h. Der Rest folgt daraus. Vielleicht fehlt ihm 
irgendeine Env-Variable, die in DOS vorhanden aber in Windows nicht 
vorhanden ist (sowas wie #ifdef DOS ... im stdio.h).

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Elias B. schrieb:

> #include <stdio.h>

...

> Error BIN.C 5: Undefined symbol 'FILE' in function main


Komisch.

In der zu TC2.01 gehörenden /stdio.h/ ist FILE definiert.

Sicher, daß bei Dir der include-Pfad korrekt gesetzt ist?

von (prx) A. K. (prx)


Lesenswert?

Wenn er das File nicht gefunden hätte, hätte er es gesagt. Die Frage ist 
also eher, ob er das richtige File gefunden hat, oder dessen Inhalt 
aufgrund einer abgewiesenen #ifdef Klammer ignorierte.

von Adler (Gast)


Angehängte Dateien:

Lesenswert?

Elias B. schrieb:
> Guten Morgen,
>
> also Danke erst mal für die Zahlreichen Antworten!
>
> das ist der code:
>
> [c]
> #include <stdio.h>
> ...

> und das der output com Borland Compiler:
>
> [c]
> Turbo C  Version 2.01  Copyright (c) 1987, 1988 Borland International
> BIN.C:
> Error BIN.C 5: Undefined symbol 'FILE' in function main
> Error BIN.C 5: Undefined symbol 'file' in function main
> Warning BIN.C 5: Code has no effect in function main
> ...
>
> Vielleicht wird ja einer schlau draus !?

Änder mal deine C++ Kommentare // (die gab es damals nämlich noch nicht 
für C) in C89 Kommentare /* */, dann kompiliert das auch.

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.