Erlernen von Assembler
-
Warum wird Assembler heute nicht mehr so oft benutzt, obwohl es komplexer ist als andere hochsprachen?
-
Original erstellt von pAngel:
Warum wird Assembler heute nicht mehr so oft benutzt, obwohl es komplexer ist als andere hochsprachen?Heutzutage sind die Rechner schneller und Compiler optimieren besser. Da muss man keine komplette Grafikengine in ASsembler mehr schreiben um mickrige 320x200 Pixel bei 15 fps auf den Bildschirm zu rendern. C-Code (oder andere Hochsprachen) sind wesentlich übersichtlicher und bei der heutigenm SOftwareindustrie ist verständlicher, wartbarer Code auch extrem wichtig, da sich die Produkte teilweise ewig halten (--> Starcraft, Half-Life...wäre das in ASM geschrieben wüsste schon längst kein Blizzard/Valve-Progger mehr, was man machen muss um dieses und jenes zu patchen ;))
-
Warum funktioniert folgender Code mit TASM nicht (jedenfalls erhalte ich einen Laufzeitfehler):
DATEN SEGMENT MELDUNG DB "Hello World!", "$" DATEN ENDS STAPEL SEGMENT BYTE STACK DW 128 DUP (?) STAPEL ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATEN,ES:NOTHING,SS:STAPEL START: MOV AX, DATEN MOV DS, AX MOV DX, OFFSET MELDUNG MOV AH, 9H INT 21H CODE ENDS END START
-
was für einen laufzeitfehler genau?
-
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