Erlernen von Assembler
-
Mal ne Frage was willst du mit Assembler Programmieren ?
ich will in die betriebsystemprogrammierung einsteigen, das geht mit c++ leider nicht...
in/out sind priviligierte Instruktionen. Die Funktionieren wzar unter Win9x (dank mangelhaftem Schutzkonzept), aber in Win2k/WinXP fliegt damit dein programm nur, weil Userprogramme eben nicht direkta uf die Hardware zugreifen dürfen
war nur ein beispiel. ein anderes asm- programm kannte ich derzeit nicht. soweit ich weiß killt es die daten des bios.
-
Original erstellt von pAngel:
**in/out sind priviligierte Instruktionen. Die Funktionieren wzar unter Win9x (dank mangelhaftem Schutzkonzept), aber in Win2k/WinXP fliegt damit dein programm nur, weil Userprogramme eben nicht direkta uf die Hardware zugreifen dürfenwar nur ein beispiel. ein anderes asm- programm kannte ich derzeit nicht. soweit ich weiß killt es die daten des bios.**
Ein Grund mehr, warum WinXP das nicht zulassen sollte
Ein Beispiel wäre:
#include <stdio.h> int addiere(int a, int b) { int sum; __asm { mov eax, a mov ebx, b add eax, ebx mov sum, eax } return sum; } int main() { printf("%i", addiere(3, 5)); }
(Anmerkung für Erbsenzähler: Ja, man kann auch bei add eax, ebx schluss machen und das ganze noch um einiges kürzen, aber es soll ja anschaulich bleiben ;))
[ Dieser Beitrag wurde am 05.03.2003 um 21:11 Uhr von TriPhoenix editiert. ]
-
man kann C- Variablen auch in Assembler verwenden?
-
Original erstellt von pAngel:
man kann C- Variablen auch in Assembler verwenden?im inline-Assembler von MSVC ja, sonst wird die interaktion so schwer
-
fang erst morgen an zu lernen.
mal ne frage zu fortgeschrittenen:
was kann man mit assembler alles machen, was man mit anderen sprachen nicht machen kann?
UND: ist es schwer Assembler zu lernen?
-
Original erstellt von pAngel:
fang erst morgen an zu lernen.
mal ne frage zu fortgeschrittenen:
was kann man mit assembler alles machen, was man mit anderen sprachen nicht machen kann?
UND: ist es schwer Assembler zu lernen?Nun ich weiß nicht ob es viel gibt, was man nur in asm machen kann. ASM arbeitet ja vor allem in drei Bereichen:
- Gerätetreiberprogrammierung. Für Direkt-IO wie die oben genannten Befehle in und out hat C meistens kein äquivalent, weils in User-Programmen ja auch nichst zu suchen hat. In Kerneltreibern kann das durchaus mal notwendig sein. In Treibern werden deswegen oft kleine Assembler-Routinen benutzt
- Hocheffektive Grafikprogrammierung. Auch heutzutage nutzen die Compiler selten Features wie MMX/SSE/3DNow. Wenn es um Parallelverarbeitung von großen Daten geht, nutzt man dann ab und zu assembler, weil der Compiler manchmal einfach zu "dumm" ist, um richtig zu optimieren.
- Betriebssystemprogrammierung. Einige Teile der OS-Programmierung (Startup, Speicherverwaltung, Protected-Mode-Kommunikation) lassen sich in C nunmal einfach nicht lösen und es muss asm her. Jedoch ist es auch hier üblich so wenig wie möglich, so viel wie nötig in asm zu schreiben. Ohne geht es jedoch auf KEINEN Fall.
Ob asm nun leicht zu lernen ist hängt sichelrich vom lernenden ab. Hilfreich ists, wenn du shcon eine Programmiersprache beherrscht, wichtig ist dann vor allem das Konzept von asm zu lernen, dass man keine großen Sprachkonstrukte hat sondenr nur kleine Mini-Befehle mit denen man sich alles zusammensetzt. Wenn du das Konzept begriffen hast, ist der Rest fast nur noch lernen welche Bedeutung welcher Befehl hat.
-
wie spricht man "Mnemonic" aus?
-
man übt
oder läßt das M weg
-
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