Erlernen von Assembler
-
Diese Anwendung wird aufgrund eines unzulässigen Zugriffs beendet.
Alle Anwendungen beenden und Computer neu startenFalls bei der Arbeit mit dem Programm permanent Probleme auftreten, klicken Sie auf die Schaltfläche "Start" und dann nacheinander auf "Hilfe", "Problembehandlung" und "Wenn Probleme beim Ausführen von MS-DOS-Programmen auftreten".
In dieser Anwendung ist ein unbekannter Ausnahmefehler aufgetreten.
Ort des Fehlers: 1434:40DA
Bediente Interrupts: Keine*
-
> Ort des Fehlers: 1434:40DA
roflSpielt es eine Rolle, ob man
START: MOV AX, DATENoder
START: MOV AX, @DATENschreibt? ich dachte man müsste "@" nehmen..
Ausserdem würde ich dein Programm (wenn du unter DOS arbeitest)
noch beenden mitmov ax,4C00h
int 21h(wenn ich mich recht erinnere)
-
geht leider immer noch net...
-
ist leider schon 'n bissl her, dass ich mit TASM programmiert habe (nutze jetzt NASM), versuchs aber trotzdem mal (mit TASM Hilfe von BC3.1)
Deine Segment Namen kommen mir irgendwie komisch vor (aber vielleicht hast du ja nen
deutschen
Assembler.
Standardmässig sollten folgende Segmente genutzt werden:
.DATA -> initialisierte Daten
.DATA? -> nicht-initialisierte Daten (eventuell auch .BSS)
.CODE -> Code
.STACKWillst du die Segmente selbst definieren (und eben dann deutsche Namen benutzen), solltest du auch entsprechend volle Syntax überall angeben, wie bei
STAPEL SEGMENT BYTE STACK
zB für 16-Bit Programme
CODE SEGMENT PARA PUBLIC USE16 'CODE'
oder für 32-Bit Programme
CODE SEGMENT PARA PUBLIC USE32 'CODE'und anstatt
MOV AX, DATEN
versuchs mit
MOV AX, SEG @DATA
bzw.
MOV AX, SEG @DATEN
-
ach käse ...
Er will jetzt halt nicht die "Vereinfachten Segmentanweisungen" benutzen, sondern die älteren.
Und das mit dem "@data" braucht er nicht...
@pAngel:
Das einzige was du falsch gemacht hast ist, dass du es nicht beendet hast. Es ist über seine Code-Grenzen hinaus ausgeführt worden.So funktionierts:
; Hier kommen die Daten hin Daten SEGMENT Meldung DB "Hello World!", "$" Daten ENDS ; Dieser Abschnitt legt den Stack fest Stapel SEGMENT BYTE STACK dw 128 DUP (?) Stapel ENDS ; Und hier kommt dein Code hin Code SEGMENT ASSUME CS:CODE, DS:DATEN,ES:NOTHING,SS:STAPEL start: mov ax, Daten mov ds, ax mov dx, offset meldung mov ah, 09h int 21h mov ax,4C00h int 21h Code ENDS END start
[EDIT]
Fast vergessen:
Mein Assembler: TASM 4.1, Linker: Turbo Link 7.1.30.1
[/EDIT][ Dieser Beitrag wurde am 07.03.2003 um 15:01 Uhr von darkpenguin editiert. ]
-
Jetzt gehts! Cool.
[ Dieser Beitrag wurde am 07.03.2003 um 18:09 Uhr von pAngel editiert. ]
-
Aber warum funzt das vom Tutorial nicht... Das Hello World- Programm vom Tutorial... Hat er dort einen Fehler gemacht oda was?
[ Dieser Beitrag wurde am 07.03.2003 um 18:10 Uhr von pAngel editiert. ]
-
Wie schon gesagt: Anscheinend fehlten in deinem Tutorial die Zeilen
mov ax,4C00h int 21h
Dies ruft die Unterfunktion 4Ch vom Interrupt 21h auf, welche das aktuelle Programm beendet und die Kontrolle wieder ans OS zurückgibt. Achja: Von welchem Tutorial lernst du das? Ist nicht so vorbildlich solche fehler zu machen.
Merk dir eines: Obwohl sich so ein Programm von deinem Tutorial fehlerlos assemblieren lässt, heisst das (tja das ist halt assembler
)noch lange nicht, dass es ohne eine Schutzverletzung ausgeführt werden kann. --> im gegensatz zu C/C++
Grüsse
Raphael
-
Also gibt es unter Assembler zum größten Teil Laufzeitfehler?
Warum wird das Programm, dass man unter Assembler geschrieben hat übrigens nicht sofort geschlossen (im Gegensatz zu MSVC6)? (obwohl es ja nur Vorteile hat...)Tja bisher war das Tutorial eher kompliziert und frustrierend. Vielleicht kennt ja Assembler auch "eine weiche Seite"...
Hat Assembler (wie C++: WinAPI, MFC, Standard, WinsockAPI ...) spezielle Gebiete, ich weiß ja noch nicht viel, was Assembler kann. Im ersten Sinne, will ich später mal mein eigenes OS zusammenstellen?
Assembler wird nicht so gern ind er Softwareindustrie genutzt. Bisher weiß ich nur den Grund, weil es so kompliziert ist und aufwendig ist zu debuggen, aber durch Assembler lassen sich meines Wissens nach doch viele flexiblere und komplexere Programme erstellen (vielleicht sind einpaar Spiele in Assembler programmiert)?
-
Original erstellt von pAngel:
**Also gibt es unter Assembler zum größten Teil Laufzeitfehler?
**Was für fehelr denn sonst
Kompilierfehler entfallen weil nicht kompiliert sonde nur Übersetzt wird. Maximal typos in den Mnemonics oder falsche Anwendung von Metabefehlen wie SEGMENT.
**
Warum wird das Programm, dass man unter Assembler geschrieben hat übrigens nicht sofort geschlossen (im Gegensatz zu MSVC6)? (obwohl es ja nur Vorteile hat...)
**Inwiefern sofort geschlossen. Jedes C-Programm beinhaltet auch intern einen aufruf von _exit() und beendet sich damit auch explizit
**
Hat Assembler (wie C++: WinAPI, MFC, Standard, WinsockAPI ...) spezielle Gebiete, ich weiß ja noch nicht viel, was Assembler kann. Im ersten Sinne, will ich später mal mein eigenes OS zusammenstellen?
**Siehe oben
Betriebssystemprogrammierung, Geräte/Treiberprogrammierung, Optimierung von Kernroutinen (insbesondere Bildverarbeitung).
Auch wenn du ein OS programmierst, wirst du vermutlich nur Kernteile in Assembler schreiben, weil es halt Dinge gibt, die in C nunmal nicht machbar sind, den Rets macht man üblicherweise in C.**
Assembler wird nicht so gern ind er Softwareindustrie genutzt. Bisher weiß ich nur den Grund, weil es so kompliziert ist und aufwendig ist zu debuggen, aber durch Assembler lassen sich meines Wissens nach doch viele flexiblere und komplexere Programme erstellen (vielleicht sind einpaar Spiele in Assembler programmiert)?**Assembler wird nach wie vor immer nur in kleinen Kernroutinen benutzt. In Spielen z.B. gerne mal für Vektoroperationen, in Grafikbearbeitungen zur Parallelverarbeitung von Daten etc. Man nutzt Assembler quasi immer soviel wie nötig, so wenig wie möglich, gerade in der Industrie, weil es halt etwas komplexer zu lesen ist.
[ Dieser Beitrag wurde am 07.03.2003 um 22:57 Uhr von TriPhoenix editiert. ]
-
Inwiefern sofort geschlossen. Jedes C-Programm beinhaltet auch intern einen aufruf von _exit() und beendet sich damit auch explizit
Ich mein, dass das Fenster bei C sofort geschlossen wird, bei asm nicht...
-
Original erstellt von pAngel:
**Inwiefern sofort geschlossen. Jedes C-Programm beinhaltet auch intern einen aufruf von _exit() und beendet sich damit auch explizitIch mein, dass das Fenster bei C sofort geschlossen wird, bei asm nicht... :)**
Hmmm...wundert mich dass das überhuapt so ist. Wenn du ein Win32-Konsolen-Programm schreibst dürfte der Unterschied auf jeden Fall nicht mehr da sein
-
kann assembler auch sowas wie WinAPI oder WinsockAPI (naja, ich werde natürlich C++ für sowas verwenden
, aber würde trotzdem egrn wissen, ob sowas mit assembler möglich ist...)?
-
Original erstellt von pAngel:
kann assembler auch sowas wie WinAPI oder WinsockAPI (naja, ich werde natürlich C++ für sowas verwenden, aber würde trotzdem egrn wissen, ob sowas mit assembler möglich ist...)?
Klar, du kannst die gesamte WinAPI und auch sonst jede API benutzen die auhc in C verfügbar ist. Letztendlich wird ein C-Programm ja auch in assembler übersetzt.
-
Danke für die schnellen und guten Informationen.
Bis jetzt war Assembler etwas kompliziert (Prozessor, Stack, Datensegmente usw.), mal sehen was kommt.Vielleicht werd ich noch einer von euch
[ Dieser Beitrag wurde am 08.03.2003 um 10:54 Uhr von pAngel editiert. ]
-
Bisher scheinst du TASM benutzt zu haben. Wenn dir auch MASM recht ist, siehe hier: http://win32asm.cjb.net/
Das ist IMHO die beste Website zum Thema. Du findest auch MASM ( legal
)
Es gibt Tutorials über WinAPI, VXD's (Gerätetreiber) und Datenbanken, sowie auch VIEL Source-Code.Ein Beispiel von einer Win32-Anwendung, welche eine MessageBox erscheinen lässt:
.386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib .data .code start: invoke ExitProcess,0 end start
Das funktioniert aber nicht mit deinem Assembler.
mfg
Raphael
-
Original erstellt von darkpenguin:
**Ein Beispiel von einer Win32-Anwendung, welche eine MessageBox erscheinen lässt:.386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib .data .code start: invoke ExitProcess,0 end start ```**
ALso ich vermisse den Aufruf von MessageBox
-
wie peinlich ....
SO sollte es sein:.386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib include \masm32\include\user32.inc includelib \masm32\lib\user32.lib .data MsgBoxCaption db "Titel der msg-Box",0 MsgBoxText db "Hallo!!!",0 .code start: invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK invoke ExitProcess, NULL end start
-
In einem Tutorial stand, TASM sei einer der besten Assembler, der auch die Syntax von anderen Assembler übersetzen kann. Warum sollte ich MASM nutzen (oder einen anderen Assembler) bzw. welche Vorteile hat es?
-> Es gibt ein "Visual Assembler"- Projekt im Internet, vielleicht schon mal was davon gehört? Jedenfalls, was haltet ihr davon?
[ Dieser Beitrag wurde am 09.03.2003 um 14:52 Uhr von pAngel editiert. ]
-
Original erstellt von pAngel:
**In einem Tutorial stand, TASM sei einer der besten Assembler, der auch die Syntax von anderen Assembler übersetzen kann. Warum sollte ich MASM nutzen (oder einen anderen Assembler) bzw. welche Vorteile hat es?-> Es gibt ein "Visual Assembler"- Projekt im Internet, vielleicht schon mal was davon gehört? Jedenfalls, was haltet ihr davon?
**Also ich würde sagen, der Schreiber des Tutorials war TASM-User
Soweit ich weiß ist die Diskussion welcher Assembler besser ist so alt wie die Diskussion welcher C-Compiler oder welche Programmiersprache besser ist. TASM hat halt den Nachteil, dass es nicht frei verfügbar ist, während z.B. NASM und MASM kostenlos legal erhältlich sind. Im Endeffekt denke ich ists pure Geschmackssache.
Vom Visual Assembler hab ich noch nichts gehört, aber wenn du nen Link hast, bin ich interessiert