Kleine Anfängerfrage
-
Abend Leute
Ich hab grad erst mit ASm angefangen, um ein bissl mehr über meinen pc zu lernen.
allerdings mach ich grad ein tut durch, aber mich kann irgendwie nicht linken. irgendwas mach ich falsch.
Als Assembler benutze ich MASM.
Compilen geht , linken nicht.Code:
.model small
.stack
.code
mov ah,1h; moves the value 1h to register ah
mov cx,07h;moves the value 07h to register cx
int 10h;10h interruption
mov ah,4ch;moves the value 4 ch to register ah
int 21h;21h interruption
ENDFehler beim linken:
test.obj : warning LNK4078: multiple ".data" sections fo
butes (C0220040)
LINK : error LNK2001: unresolved external symbol _mainCR
test.exe : fatal error LNK1120: 1 unresolved externalsWäre super wenn ihr mir hilft
-
Kommt bitte, postet mal so ein kleines komplett compilierbare programm. muss es diese mainfunktion geben, glaub bicht, denn so war der code direkt im tut. Er wurde aber im Tut mit TASM compiled.
-
Oje, M$ vermurxte Fehlermeldungen *sigh*
Was der Kram mit dem "multiple .data ...bla" zu bedeuten hat, ist mir auch nicht so ganz klar, aber ansonsten sehe ich schonmal, dass kein Codeentrypoint gesetzt ist (wahrscheinlich das unresolved external _mainCR). Deshalb liesse sich der Code auch mit TASM nicht ohne mindestens eine weitere .obj-Datei, die den Eintrittspunkt enthaelt linken.
Wenn also in dem Tutorial nicht genau beschrieben steht, wie Du die erstellte .obj-Datei linken sollst, ist das Tutorial schrott und Du solltest besser mit einem anderen lernen (schau dich z.B. mal in der FAQ um)
-
Kannst du mir kurz erklären wie das mit den eintrittspunkt funzt. Und jetzt werd ich mir mal die Tuts anschauen. anscheinend ist dieses tut echt scheiße
-
*g* sorry, sollst Du natuerlich aufgeklaehrt werden:
model small .stack .code Start: ;hier soll das Programm starten. <= Code-eintrittspunkt mov ah,1h; moves the value 1h to register ah mov cx,07h;moves the value 07h to register cx int 10h;10h interruption mov ah,4ch;moves the value 4 ch to register ah int 21h;21h interruption END Start ;hier muss das Label stehen, bei dem der Code gestartet werden soll
-
Danke, allerdings musste ich Start _Start nennen, dann ging es. Bei Problemen meld ich mich.
-
Kannst du mir noch sagen was man zum beenden eines programm für einen befehl nimmt. ansonstenm stürzt das programm ja ab. Funktionieren tut die WinAPI Funktion ExitProcess, aber es geht auch bestimmt anders. muss ich da eiinen interrupt aufrufen.Könnte das das hier sein:
mov ah,4ch;
int 21h;wenn ja was bedeutet 4ch, was ist das für ein wert
-
Hmm ... schreib ich auch mal was
Das 4c ist in DOS die Funktion zum Beenden eines Programms. Die (Software-)Interrupts waren in DOS die primäre Schnittstelle zum Betriebssystem, über das AH - Register wird die Funktionsnummer übergeben.
Nr. 09h lässt etwa Text ausgeben (muss mit nem $-Zeichen enden!)Text DB "Hallo Welt$" ... MOV AH,9 MOV DX, offset Text INT 21h
Jede Funktion, egal ob Text ausgeben, Dateien bearbeiten, Speicher anfordern, alles hat eine bestimmte Funktionsnummer. Ne Übersicht über die wichtigsten Funktionen des INT 21h gibts unter http://spike.scu.edu.au/~barry/interrupts.html
mfg ETNA
-
Noch eine kleine Anmerkung: Bitte nicht versuchen, in einem Windowsprogramm DOS oder BIOS Interrupts zu benutzen (auch nicht in Win32 Konsolenanwendungen im "DOS"-Fenster), des funzt naemlich nicht.
-
Das heit ich darf keine interupts (int) benutzen oder wie. Nur in 16-Bit DOS-Programmen oder wie. Hab aber schon viele Codes gesehen die das machen, sind die nicht unter Windows ausführbar. Also muss ich am Schluss ExitProcess aus der WinAPI verwnden, oder was verwendet man dann.
Z.B. wenn ich nur mal mit mov AX, AA etwas in den Register schreibe.
Wie schaut dann ein komplett lauffähiges programm ab. bisjetzt stürzt das programm imer am Schluß ab.
-
Aber kann man dann wirklich mit asm so system nah sein ohne die interrupts.
Gibt es Assembler die auch 16-Bit Code erstellen? Wenn ja welchen?
-
In 16Bit DOS-Anwendungen kannst Du DOS Interrupts etc. benutzen. In allen anderen Anwendungen in Windows nicht.
Eigentlich unterstuetzen alle halbwegs sinnvollen Assembler 16Bit Code. z.B. NASM, der ist auch noch Freeware.(siehe FAQ)
Mit Interrupts programmierst Du etwa genauso Systemnah wie ohne, aber ProtectedMode-Systeme, wie Windows verbieten auch den direkten Zugriff auf Hardwareports, das ist es, was letztendlich wirklich Hardwarenahe Programmierung unmoeglich macht.
DOS Anwendungen werden ueber int 20h oder int 21h (ah=4C) beendet, Windowsanwendungen ueber die WinAPI (ExitProcess), ein Programm am Ende offen zu lassen ist nicht sinnvoll.
-
Super danke dass du mich aufgeklärt hast.
Ist dieser 16-Bit ein Code der auch Windows ausgeführt werden kann (so Programme gibt es ja), oder ist es dann wirklich so ein Code der nur im puren DOS ausgeführt werden kann (is wahrscheinlicher)Gibt es zum NASM auch ne passende IDE.
-
16Bit Code kann auch in Windows ausgefuehrt werden, in einer Virtual Machine. Da wird gewissermassen ein DOS-Rechner im RealMode simuliert. Aber wie bereits gesagt, Funktionieren direkte Hardwarezugriffe nicht immer richtig.
Zum NASM kann man auch eine IDE benutzen, z.B. habe ich die hier ueber google gefunden
-
Jo super danke
. Aber der Masm32, kann anscheinend keinen 16-Bit Code compilen , soweit wie ich es bemerkt habe.
-
Der MASM kann ganz sicher auch 16bit code generieren.
Natürlich wirds dann keine exe datei in der du windows funktionen aufrufen kannst.
Das geht vielleicht mit einem Compilerschalter, vielleicht mit einem Schlüsselwort im Code. Ich hab den MASM halt nicht.