ich bringe es nicht...
-
so irgendwie schaffe ich nicht diesen code hier...
CSEG segment org 100h Begin: mov ah,9 mov dx,offset Message int 21h int 20h Message db 'Hello, world!$' CSEG ends end Begin
mit hilfe von masm 's qeditor zu assemblen ohne fehler -( dabei kommt folgendes raus...
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.Assembling: C:\masm32\project\00C\hello.asm
C:\masm32\project\00C\hello.asm(15) : warning A4023: with /coff switch, leading
underscore required for start address : Begin
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.hello.obj : fatal error LNK1190: invalid fixup found, type 0x0001
_
Link error
Drücken Sie eine beliebige Taste . . .kommt halt dabei raus wenn ich auf Project -> Assembly&Link gehe -(
könnte mir jemand vll sagen wie man mit masm etwas assembliert und danach auch richtig linkt? so ne art mini einführung ?
-
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.Assembling: C:\masm32\project\00C\hello.asm
C:\masm32\project\00C\hello.asm(15) : warning A4023: with /coff switch, leading
underscore required for start address : Begin
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.hello.obj : fatal error LNK1190: invalid fixup found, type 0x0001
_
Link error
Drücken Sie eine beliebige Taste . . .Also ich kenn mich mit Assembler nicht wirklich gut aus, aber der Meldung zufolge würde ich sagen, dass der einen Punkt vor Begin erwartet:
.Begin:
-
Link error
16-bit Programm mit einem 32-bit Linker zu linken geht nicht so gut
allerdings wurde schon hier:
http://board.codingcrew.de/viewtopic.php?t=190&highlight=
darauf eingeganen.
Deshalb bleibt auch:
http://board.codingcrew.de/viewtopic.php?t=219
unbeantwortet.
Auch hier im Forum gab es die Frage schon häufiger (seltsamer weise findet die Suchfunktion die nicht<- keine ironie)
http://c-plusplus.net/forum/viewtopic-var-t-is-108963-and-highlight-is-masm.html
-
sobald ich heute zuhause bin werde ich es ausprobieren!
ich danke dir vielmals für die links!
-
also wenn ich da nen punkt vor Begin mache dann kommt folgendes...
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.Assembling: C:\masm32\project\00C\hello.asm
C:\masm32\project\00C\hello.asm(4) : error A2008: syntax error : .
C:\masm32\project\00C\hello.asm(15) : error A2006: undefined symbol : Begin
_
Assembly Error
Drücken Sie eine beliebige Taste . . .CSEG segment org 100h .Begin: mov ah,9 mov dx,offset Message int 21h int 20h Message db 'Hello, world!$' CSEG ends end .Begin
das mit dem linker 16 BIT, klappt auch irgendwie nicht, ich habs probiert und zwar, bin mal ins masm ordner bin rein und habe den eigentlichen LINK.EXE kurz umbennant ins LINKx.EXE und habe darein den anderen 16 BIT linker reingeladen mit dem namen LINK.EXE logisch denke ich mal, weil dann assembliert ja der QEDITOR damit, naja aber bekomme trotzdem fehler z. B. bei dem s. o. code kommt dabei sowas raus...
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.Assembling: C:\masm32\project\00C\hello.asm
C:\masm32\project\00C\hello.asm(4) : error A2008: syntax error : .
C:\masm32\project\00C\hello.asm(15) : error A2006: undefined symbol : Begin
_
Assembly Error
Drücken Sie eine beliebige Taste . . .und wenn ich den code schreibe ohne den punkt(.) vor dem Begin dann kommt folgendes raus...
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.Assembling: C:\masm32\project\00C\hello.asm
C:\masm32\project\00C\hello.asm(15) : warning A4023: with /coff switch, leading
underscore required for start address : BeginMicrosoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994
Copyright (C) Microsoft Corp 1984-1993. All rights reserved.LINK : warning L4017: /SUBSYSTEM : unrecognized option name; option ignored
LINK : warning L4017: /OPT : unrecognized option name; option ignored
Run File [c:hello.exe]:habe irgendwie kein plan was ich jetzt machen soll...
-
Moin raycon,
das MASM-Paket ist auf die Entwicklung von Win32-Anwendungen zugeschnitten. Die von Dir angesprochenen Menüeinträge zum Assemblieren etc. rufen Skripte auf, die Win32-Anwendungen erzeugen.
Für DOS-Anwendungen musst Du den Assembler und den 16-Bit-Linker von Hand aufrufen.
Normalerweise lauten die Aufrufe:
ml /c DeinProgramm.asm
link16 DeinProgramm.obj;Du kannst aber auch ein Skript erstellen, um das zu automatisieren oder Makefiles nutzen.
Ein Beispiel für ein Übersetzungsskript findest du unter dem Link:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-38987-and-highlight-is-gedicht.htmlDas drittletzte Posting enthält ein Beispiel. Das Skript verwendet den Linker alink. Setze hier den Namen des Linkers ein, den Du verwendest.
Ciao...
-
moin moin Kal El,
nunja, ich habe jetzt folgendes gemacht mir den 16BIT linker in meine bin rein, bzw war ja schon vorher drin, in meinem project ordner sprich in dem ordner wo sourcecode drin ist, die batch datei gemacht, eben die was unter deinem link war bzw etwas modifiziert und zwar...
@echo off if exist %1.obj del %1.obj if exist %1.exe del %1.exe \masm32\bin\ml /c %1.asm if errorlevel 1 goto asmerror \masm32\bin\link16 %1.obj if errorlevel 1 goto linkererror dir %1.* goto ende :linkererror echo _ echo FEHLER: Linker goto ende :asmerror echo _ echo FEHLER: Assembler goto ende :ende pause
aus alink habe ich link16 gemacht! nunja habe jetzt fogendes gemacht, aus den Eingabeaufforderungen...
C:\masm32\project\00C>dir
Volume in Laufwerk C: hat keine Bezeichnung.
Volumeseriennummer: 141D-7126Verzeichnis von C:\masm32\project\00C
14.07.2005 22:50 <DIR> .
14.07.2005 22:50 <DIR> ..
14.07.2005 22:43 344 doexe.bat
14.07.2005 13:53 148 hello.asm
2 Datei(en) 492 Bytes
2 Verzeichnis(se), 77.954.351.104 Bytes freiC:\masm32\project\00C>doexe.bat hello
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.Assembling: hello.asm
Microsoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994
Copyright (C) Microsoft Corp 1984-1993. All rights reserved.Run File [hello.exe]:
List File [nul.map]:
Libraries [.lib]:
Definitions File [nul.def]:
LINK : warning L4021: no stack segment
Volume in Laufwerk C: hat keine Bezeichnung.
Volumeseriennummer: 141D-7126Verzeichnis von C:\masm32\project\00C
14.07.2005 13:53 148 hello.asm
14.07.2005 22:51 791 hello.exe
14.07.2005 22:51 83 hello.obj
3 Datei(en) 1.022 Bytes
0 Verzeichnis(se), 77.954.342.912 Bytes frei
Drücken Sie eine beliebige Taste . . .C:\masm32\project\00C>hello.exe
C:\masm32\project\00C>
naja, 2 probleme gibt es jetzt nur noch, die eine ist mit der Warnung und das andere ist es, wo bleibt die konsolen ausgabe? aber ich glaube das, das 2 problem mit dem ersten zusammenhängt...
danke noch mal!
//edit
übrigens, wollte gerade diesen code hier ausprobieren...
.model tiny ;nur ein kleines Programm .code ;hier steht der code org 100h ;wir basteln ne COM Datei START: ;Label zum verzieren mov ah, 0h ;wir ändern den Bildschirmmodus mov al, 12h int 10h lea si, HelloWorld ;si zeigt auf unseren String mov cx, lenght ;cx = Stringlänge LoopIt: push cx ;cx speichern lodsb ;Buchstaben des Strings in al lesen mov ah, 2h ;Cursor setzen mov bh, 0h ;auf Page 0 mov dh, 2h ;Zeile mov dl, byte ptr XXX ;XXX ist die Spalte int 10h inc byte ptr XXX ;Farbe erhöhen mov ah, 09h ;Farbiger Charakter ausgeben mov bh, 0h ;Page 0 mov bl, byte ptr XXX ;Farbe mov cx, 1h ;schreibe ihn einmal.. int 10h pop cx ;cx laden loop LoopIt ;wiederholen, bis der komplette ;String geschrieben ist mov ah, 2h ;Cursor setzen mov bh, 0h ;auf Page 0 mov dh, 3h ;Zeile mov dl, 3h ;Spalte int 10h mov ah,1h ;auf Tastatureingabe warten int 21h mov ah, 4Ch INT 21h ;Beende ! HelloWorld db 'Hello World !!' ;Unser String.. lenght equ $ - offset HelloWorld xxx db 0h END START ;hier ist das ganze zuende..
dabei bekamm ich ähnlichen oder selben fehler wie beim dem hello code, und zwar diesen hier...
LINK : warning L4021: no stack segment
irgendwie verstehe ich die warnung nicht...
-
Hm, kannst du Englisch
Die Ausgabe sagt doch alles. No stack segment -> kein Segment für einen Stack. Du benutzt push und pop um Daten auf den Stack zu schieben und wieder zu lesen, hast aber keinen Stack definiert. Wo soll das Programm die Daten jetzt hinschieben?
-
Die Meldung kannst Du getrost ignorieren - zumindest solange model TINY verwendet wird (und die besagt dass man eigentlich eine COM haben möchte). Denn da beginnt der Stack bei 0ffffh und wächst nach oben - der Applikation entgegen. Bei dem kleineren Code sollte es keine Probleme geben, da er keinen Stack verwendet. Die Warnung verschwindet auch wenn man den Linker richtig aufruft (siehe unten).
Um eine Ausgabe auch zu sehen: dein Programm von Kommandozeile aus aufrufen (zumindest das kleine). Oder eben eine Lesefunktion einbauen, so dass das Programm nach der Ausgabe nicht eben geschlossen wird.
Imho sind beide Queltexte für COM dateien (oder wozu sonst soll das org 100 da sein? *mich mit 16-bit assembly nicht so auskenn* )
um auch eine COM zu bekommen.
Hab jedenfalls Deinen ersten Code assembliert (den ohne Punkt ;)):CSEG segment org 100h Begin: mov ah,9 mov dx,offset Message int 21h int 20h Message db 'Hello, world!$' CSEG ends end [b]Begin[/b]
ml /AT /c test.asm
AT steht dafür dass man hier COM haben will, /c verhindert den linker aufruf
linken:
link /TINIY test.obj
und voila, eine coole 23 byte große COM kommt raus.
ist man zu faul diese aus der Konsole aufzurufen, muss man nur nach der int 21h nochmov ah,1 int 21h
einfügen.
möchtest Du stattdessen Exen erstellen: lass eben AT und Tiny weg.
zum zweiten code:
mit denselben aufrufen klappts bei mir auch - und die Ausgabe sieht man dann auf jedenfall
Viel Spass noch mit der DOSe
-
Moin CDW,
CDW schrieb:
Denn da[im Modell Tiny] beginnt der Stack bei 0ffffh und wächst nach oben - der Applikation entgegen.
Das ist aber ein böser Fehler. Der Stack beginnt nicht (in Worten: nicht) bei Adresse 0x0000 und wächst dann nach oben, weder bei COM noch bei EXE. Per definitionem wächst ein Stack immer von hohen zu niedrigen Adressen.
Wenn Du ein COM-Programm startest, so ist das Register SP mit dem Wert 0xfffe belegt. Pusht Du nun einen (Word-)Wert auf den Stack, so zeigt SP dann auf Adresse 0xfffc, d.h. der Stackpointer wurde um 2 erniedrigt. Der Stack wächst der Anwendung tatsächlich entgegen, aber eben nicht von "unten" sondern von oben, von der höheren Adresse her.
Ciao...
-
Der Stack beginnt nicht (in Worten: nicht) bei Adresse 0x0000
hab ich ja niemals behauptet
CDW schrieb:
Denn da beginnt der Stack bei 0ffffh(der Stackpointer müsste natürlich auf 0fffeh zeigen, damit man die Bytes auf 0fffe und 0ffff adressiert)
aber eben nicht von "unten" sondern von oben, von der höheren Adresse her
sorry, da habe ich mich wohl missverständlich ausgedrückt, ich gehe von einem solchen "bildlichen" Speichermodell aus:
0000 0100h <-Anwendung 0130h <-Anwendung ... fffeh <-Stackanfang (wert im SP) ffffh
also wächst er bei mir von unten nach oben, der Applikation entgegen
dieses Modell hatte ich damals in der Schule und auch in diversen Debuggern (wie Olly), daran bin ich so gewonnt dass ich nicht bedacht habe dass man es auch anders sehen kann.
-
Moin CDW,
da habe ich mich wohl verlesen. Sehr merkwürdig...
Allerdings sollte man mit solchen Bildern des Speicheraufbaus nicht arbeiten, weil sie eben nicht eindeutig sind. Eindeutig ist die Angabe der Adressen.
Ciao...
-
danke euch, es klappt, bekomme zwar keine exen die dann auch funktionieren, aber ich übe erstmal für DOS und das COM ist ja für DOS -) ach naja, die Warnung ist trotzdem noch da, kann man das irgendwie lösen?
-
Moin raycon,
die Warnung, dass kein Stacksegment vorhanden ist, erzeugt der Linker, weil Du ihm nicht mitgeteilt hast, dass Du ein TINY-Programm erstellen möchtest. Die korrekten Kommandozeilenparameter lauten:
ml /AT /c DeinProgramm.asm
link16 /TINY DeinProgramm.obj,DeinProgramm.com;Warum kannst Du keine EXE erzeugen? Hier mal ein Beispiel:
DATA SEGMENT WORD MsgText db 'Tach auch...$' DATA ENDS STACK SEGMENT STACK dw 512 dup(0) STACK ENDS CODE SEGMENT WORD assume CS:CODE,DS:DATA,SS:STACK start: mov ax, SEG DATA mov ds, ax mov ah, 09h mov dx, offset MsgText int 021h mov ax, 04c00h int 021h CODE ENDS end start
Übersetzen mit:
ml /c Beispiel.asm
link16 Beispiel.obj;Ciao...
-
Kal El schrieb:
Moin raycon,
die Warnung, dass kein Stacksegment vorhanden ist, erzeugt der Linker, weil Du ihm nicht mitgeteilt hast, dass Du ein TINY-Programm erstellen möchtest. Die korrekten Kommandozeilenparameter lauten:
ml /AT /c DeinProgramm.asm
link16 /TINY DeinProgramm.obj,DeinProgramm.com;Warum kannst Du keine EXE erzeugen? Hier mal ein Beispiel:
DATA SEGMENT WORD MsgText db 'Tach auch...$' DATA ENDS STACK SEGMENT STACK dw 512 dup(0) STACK ENDS CODE SEGMENT WORD assume CS:CODE,DS:DATA,SS:STACK start: mov ax, SEG DATA mov ds, ax mov ah, 09h mov dx, offset MsgText int 021h mov ax, 04c00h int 021h CODE ENDS end start
Übersetzen mit:
ml /c Beispiel.asm
link16 Beispiel.obj;Ciao...
Alles Schrott!
Ein TINY-Speichermodel mit einem Code und Daten Segment?????
Bei einem TINY-Speichermodel (*.com Datei) gibt es kein Code/Datensegment!!!
Daten + Code + Stack liegen alle in einem Segment der max. 64kb groß sein kann
Oder irre ich mich?Dein Beispiel kann man nicht als tiny weder assemblieren noch linken!!!!!!!!
-
Ja, du irrst dich. Was willst du denn sonst machen? Absolute Adressen angeben? Der Linker macht das schon richtig.
Ich hab das Beispiel zwar nicht ausprobiert, aber es schaut ganz vernünftig aus.
-
Hallo "Keine Ahnung",
Du machst Deinem Namen wirklich alle Ehre. Aber mir ist es in diesem Thread ja auch schon passiert, dass ich ein Posting nicht richtig gelesen habe.
Schau Dir mein Posting, das Du so nett zitiert und kommentiert hast, doch nochmal genau an.
Raycon hatte in seinem Posting davor angegeben, dass er keine EXE erzeugen könne. Das Beispiel, das ich in dem, von Dir als Schrott bezeichneten, Posting angegeben hatte, sollte die Erstellung einer EXE-Anwendung zeigen. Dazu ist das Lesen des Satzes vor dem Listing recht aufschlussreich. Soweit ich nun informiert bin, nutzen unter DOS EXE-Programme die Speichermodelle SMALL, MEDIUM, COMPACT, HUGE oder LARGE. Jedoch nur Programme mit der Endung .COM benutzen das Speichermodell TINY. Das Listing macht irgendwie den EIndruck, als ob es das SMALL-Speichermodell verwendet.
Wenn Du Dir weiterhin die Kommandos zum Übersetzen des Listings anschaust(am Ende des Postings), wirst Du erkennen, dass ich keine Angaben zur Erzeugung des Speichermodells TINY gemacht habe.
Des Weiteren läßt ein scharfer Blick auf das Listing erkennen, dass nirgens ein org 100h auftaucht. Das müsste jedoch vorhanden sein, weil es sonst Fehlermeldungen hagelte, wenn ich ein TINY-Programme erstellen wollte und dabei die vollständige Segmentkontrolle verwende.
Um mit Dieter Nuhrs Worten zu sprechen: Wenn man keine Ahnung hat(oder so heißt), einfach mal die Fresse halten. :p
Vorzügliche Grüße
-
Stimmt, das hab ich jetzt auch übersehen. Naja, ist auch schon etwas länger her, dass ich DOS-Programme mit Assembler gebaut habe
-
Ja schon gut Leute, ich habs wirklich übersehen, sorry :p
Ich dachte aus dem Beispielcode sollte eine *.com Datei werden
-
Wenn Du ein COM-Programm startest, so ist das Register SP mit dem Wert 0xfffe belegt
Deswegen kann man die Warning allerdings ignorieren. Da beim COM Programm
nur ein Segment (64KByte) benutzt wird, liegt der Stack Pointer bei
0xfffe doch ganz gut.Warum eigentlich 0xfffe und nicht 0xffff(ok 0x0000), hat das Betriebssystem da schon
einige Bytes vom Stack benutzt?