Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Maschinensprache (https://www.delphipraxis.net/31751-maschinensprache.html)

Neutral General 15. Okt 2004 15:12

Re: Maschinensprache
 
Ergebnis im Anhang ...

[edit] falsche Exe .. :wall: [/edit]

Ok in der Eingabeaufforderung funktioniert es ...
Kann man dazu nicht irgendwas wie waitkey in Pascal reinschreiben damit das Fenster bleibt wenn man die Exe normal startet ?

dizzy 15. Okt 2004 15:33

Re: Maschinensprache
 
Was heisst "normal starten"? ;)
Für eine solche EXE ist es völlig normal in einer DOS-Umgebung gestartet zu werden. Und in selbiger geht man davon aus, dass DOS die einzige Shell ist, und auch nach Programmende noch lebt ;).

moritz 15. Okt 2004 15:35

Re: Maschinensprache
 
Du könntest die Zeichen über die Zeichentabelle einfügen.

Neutral General 15. Okt 2004 15:42

Re: Maschinensprache
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Du könntest die Zeichen über die Zeichentabelle einfügen
Ich versteh irgendwie nicht was du willst/meinst :wiejetzt:

1. Toll das bringt mich jetzt total weiter ^^
Kennt nicht jemand zufällig den Hex-Wert den man eingeben muss damit das Programmn nicht direkt beendet wird ? :lol:
2. Ich hab jetzt versucht 'hello world !' zu schreiben wenn ich aber das hex-Zeichen für '!' eingebe (21) passiert beim Aufruf der Exe-Datei unbeschreibliches :pale:

Delphi-Quellcode:
EB 0C 68 65 6C 6C 6F 20 77 6F 72 6C 64 21 24 BA 02 01 B4 09 CD 21 B8 01 4C CD 21 
      h e l l o    w o r l d !
-> Anhang

tommie-lie 15. Okt 2004 15:49

Re: Maschinensprache
 
Tu dir und allen anderen den Gefallen und gib die Idee gant schnell wieder auf :roll:

Zitat:

Zitat von Neutral General
Kennt nicht jemand zufällig den Hex-Wert den man eingeben muss damit das Programmn nicht direkt beendet wird ? :lol:

Du könntest auf einen Tastaturinterrupt warten (sofern unter Windows mit COM-Dateien möglich) oder den entsprechenden API-Call aufrufen um auf eine Tastatureingabe zu warten (sofern unter mit COM-Dateien möglich).

Zitat:

Zitat von Neutral General
2. Ich hab jetzt versucht 'hello world !' zu schreiben wenn ich aber das hex-Zeichen für '!' eingebe (21) passiert beim Aufruf der Exe-Datei unbeschreibliches :pale:

Ja, weil jetzt der Sprung nicht mehr stimmt, aus dem ganze einfachen Grund daß da jetzt ein Byte mehr ist als vorher. Der Anfang müsste IIRC jetzt EB 0D lauten.



Mabuse, was hast du da nur angerichtet...

Neutral General 15. Okt 2004 15:52

Re: Maschinensprache
 
Zitat:

Zitat von MaBuSE
[*]EB bedeutet JMP (Jump = Springe nach)[*]0C ist der Parameter von JMP und bedeutet 12 Byte
-> Der 1. Befehl ist also ein "goto 12 Bytes weiter"[*]68 65 6C 6C 6F 20 77 6F 72 6C 64 24 ist die hexadezimale Darstellung von "hello world$" (genau 12 Bytes :-))

klar ... wenn ich nur 12 Byte einstelle (0C) und ich schreibe 13 Byte ... :wall:

[edit] tommie-lie war schneller ... Aber ich hab schon ein neues großenwahnsinniges Projekt :spin2: und keiner kann mich davon abhalten !! Nun da ich weis, wie man mit Hex-Zeichen programmiert... muhahah :freak: [/edit]

Dussel 20. Okt 2005 12:01

Re: Maschinensprache
 
Die Frage habe ich (fälschlicherweise) schon im Tutorial erstellt. Aber hier nochmal: Kann mir jemand sagen, wie das 'hello world' Programm (als hexadezimales Programm) betriebssystemunabhängig aussieht? Im Tutorial steht es als Assembler, ich hätte es aber lieber in Hexadezimal (oder binär) programmiert.
PS:Danke für die Mühe mit dem Assembler

moritz 20. Okt 2005 12:19

Re: Maschinensprache
 
Moin!

Der Unterschied zwischen Hexadezimal und Binär ist gleich Null, da das ganze nur eine andere Darstellungsform ist. Wenn du es unbeingt binär haben willst, viel Spaß beim Umrechnen, der Nutzen daraus ist mir nicht wirklich klar.
Und wieso willst du unbedingt in Hexadezimal programmieren? Assebler macht nichts anderes, als dir das etwas leichter zu machen.

Gruß

NicoDE 20. Okt 2005 12:27

Re: Maschinensprache
 
Zitat:

Zitat von Neutral General
Kennt nicht jemand zufällig den Hex-Wert den man eingeben muss damit das Programmn nicht direkt beendet wird ?

Sieh in der Dokumentation deines Prozessors und des verwendeten Betriebssystem nach (ersteres z.B. bei Intel, letzteres z.B. in Ralf Browns Interrupt-Liste).

Zitat:

Zitat von Neutral General
2. Ich hab jetzt versucht 'hello world !' zu schreiben wenn ich aber das hex-Zeichen für '!' eingebe (21) passiert beim Aufruf der Exe-Datei unbeschreibliches

Du schreibst ein COM-Programm. EXE-Dateien haben noch einen/mehrere Header mit Informationen für das Ladeprogramm des Betriebssystems. Eine 16-Bit-EXE für MS-DOS könnte so aussehen (der Quellcodeauzug stammt aus meiner BiosHelp.pas):
Delphi-Quellcode:
const
  BlockSize = $1000;
type                                 { ; RomDump (dumps memory to STDOUT)    }
  PRomDumpCode = ^TRomDumpCode;      { ; Copyright (C) 2003 Nico Bendlin     }
  TRomDumpCode = packed record       { ; (BlockSize MUST be multiple of 10h) }
    head: TImageDosHeader;           {                                        }
    note: array [0..$4F] of AnsiChar; { @@note: db     'RomDump', ...        }
    init: packed record              { @@init:                               }
      x00050: array [0..2] of Byte;  {         mov    ax, 4400h             }
      x00053: array [0..2] of Byte;  {         mov    bx, 0001h             }
      x00056: array [0..1] of Byte;  {         int    21h                   }
      x00058: array [0..1] of Byte;  {         jc     @@code                }
      x0005A: array [0..3] of Byte;  {         and    dx, 0082h             }
      x0005E: array [0..3] of Byte;  {         cmp    dx, 0082h             }
      x00062: array [0..1] of Byte;  {         jne    @@code                }
      x00064: Byte;                  {         push   cs                    }
      x00065: Byte;                  {         push   ds                    }
      x00066: array [0..2] of Byte;  {         mov    dx, offset @@note     }
      x00069: array [0..1] of Byte;  {         mov    ah, 09h               }
      x0006B: array [0..1] of Byte;  {         int    21h                   }
      x0006D: array [0..2] of Byte;  {         mov    ax, 4C01h             }
      x00070: array [0..1] of Byte;  {         int    21h                   }
    end;                             {                                        }
    code: packed record              { @@code:                               }
      x00072: Byte; BlockCount: Word; {         mov    cx, <BlockCount>      }
      x00075: Byte; DatSegment: Word; {         mov    dx, <DatSegment>      }
      x00078: array [0..1] of Byte;  {         jcxz   @@last                }
    end;                             {                                        }
    loop: packed record              { @@loop:                               }
      x0007A: Byte;                  {         push   cx                    }
      x0007B: Byte;                  {         push   dx                    }
      x0007C: array [0..1] of Byte;  {         mov    ds, dx                }
      x0007E: Byte; DatOffset: Word; {         mov    dx, <DatOffset>       }
      x00081: array [0..2] of Byte;  {         mov    cx, <BlockSize>       }
      x00084: array [0..2] of Byte;  {         mov    bx, 0001h             }
      x00087: array [0..2] of Byte;  {         mov    ax, 4000h             }
      x0008A: array [0..1] of Byte;  {         int    21h                   }
      x0008C: Byte;                  {         pop    dx                    }
      x0008D: Byte;                  {         pop    cx                    }
      x0008E: array [0..1] of Byte;  {         jc     @@exit                }
      x00090: array [0..3] of Byte;  {         add    dx, <BlockSize / 10h> }
      x00094: array [0..1] of Byte;  {         loop   @@loop                }
    end;                             {                                        }
    last: packed record              { @@last:                               }
      x00096: array [0..1] of Byte;  {         mov    ds, dx                }
      x00098: Byte; DatOffset: Word; {         mov    dx, <DatOffset>       }
      x0009B: Byte; LenghtMod: Word; {         mov    cx, <LenghtMod>       }
      x0009E: array [0..2] of Byte;  {         mov    bx, 0001h             }
      x000A1: array [0..2] of Byte;  {         mov    ax, 4000h             }
      x000A4: array [0..1] of Byte;  {         jcxz   @@exit                }
      x000A6: array [0..1] of Byte;  {         int    21h                   }
      x000A8: array [0..1] of Byte;  {         jc     @@exit                }
      x000AA: array [0..1] of Byte;  {         mov    al, 00h               }
    end;                             {                                        }
    exit: packed record              { @@exit:                               }
      x000AC: array [0..1] of Byte;  {         mov    ah, 4Ch               }
      x000AE: array [0..1] of Byte;  {         int    21h                   }
    end;                             {                                        }
  end;                               {                                        }
const
  RomDumpCodeSize = SizeOf(TRomDumpCode) - SizeOf(TImageDosHeader);
  RomDumpCode: TRomDumpCode = (
    head: (
      e_magic  : IMAGE_DOS_SIGNATURE;
      e_cblp   : Word(RomDumpCodeSize) and $1FF;
      e_cp     : Word((RomDumpCodeSize - 1) shr 9) + 1;
      e_crlc   : $0000;
      e_cparhdr : SizeOf(TImageDosHeader) shr 4;
      e_minalloc: $0000;
      e_maxalloc: $FFFF;
      e_ss     : $0000;
      e_sp     : $1000;
      e_csum   : $0000;
      e_ip     : SizeOf(RomDumpCode.note);
      e_cs     : $0000;
      e_lfarlc : SizeOf(TImageDosHeader);
      e_ovno   : $0000;
      e_res    : ($0000, $0000, $0000, $0000);
      e_oemid  : $0000;
      e_oeminfo : $0000;
      e_res2    : (
        $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000);
      _lfanew  : $00000000
    );
    note: #13#10'RomDump 2.2'#13#10 +
      'Copyright (C) 2003 Nico Bendlin'#13#10#13#10 +
      'Usage: RomDump > filename'#13#10#13#10'$';
    init: (
      x00050: ($B8, $00, $44);
      x00053: ($BB, $01, $00);
      x00056: ($CD, $21);
      x00058: ($72, $18);
      x0005A: ($81, $E2, $82, $00);
      x0005E: ($81, $FA, $82, $00);
      x00062: ($75, $0E);
      x00064: $0E;
      x00065: $1F;
      x00066: ($BA, $00, $00);
      x00069: ($B4, $09);
      x0006B: ($CD, $21);
      x0006D: ($B8, $01, $4C);
      x00070: ($CD, $21);
    );
    code: (
      x00072: $B9; BlockCount: $0020;
      x00075: $BA; DatSegment: $E000;
      x00078: ($E3, $1C)
    );
    loop: (
      x0007A: $51;
      x0007B: $52;
      x0007C: ($8E, $DA);
      x0007E: $BA; DatOffset: $0000;
      x00081: ($B9, Lo(BlockSize), Hi(BlockSize));
      x00084: ($BB, $01, $00);
      x00087: ($B8, $00, $40);
      x0008A: ($CD, $21);
      x0008C: $5A;
      x0008D: $59;
      x0008E: ($72, $1C);
      x00090: ($81, $C2, Lo(BlockSize shr 4), Hi(BlockSize shr 4));
      x00094: ($E2, $E4)
    );
    last: (
      x00096: ($8E, $DA);
      x00098: $BA; DatOffset: $0000;
      x0009B: $B9; LenghtMod: $0000;
      x0009E: ($BB, $01, $00);
      x000A1: ($B8, $00, $40);
      x000A4: ($E3, $06);
      x000A6: ($CD, $21);
      x000A8: ($72, $02);
      x000AA: ($B0, $00)
    );
    exit: (
      x000AC: ($B4, $4C);
      x000AE: ($CD, $21)
    )
  );

nieurig 20. Okt 2005 12:36

Re: Maschinensprache
 
Hallo Leute, ich habe diesen Beitrag erst jetzt gesehen und komme also spät dazu:

TROTZDEM und auch wenn das schon mal gesagt wurde ...

Hallo Mabuse!
Super Anleitung/Beschreibung
Angesichts der heutigen Tools fällt es schwer jemandem die absoluten Grundlagen darzustellen. Dein Text ist Spitze.

Niels

MaBuSE 20. Okt 2005 12:46

Re: Maschinensprache
 
Zitat:

Zitat von nieurig
Hallo Mabuse!
Super Anleitung/Beschreibung
Angesichts der heutigen Tools fällt es schwer jemandem die absoluten Grundlagen darzustellen. Dein Text ist Spitze.
Niels

Danke

Dussel 20. Okt 2005 14:54

Re: Maschinensprache
 
Dass binär und hexadezimal das gleiche ist, ist mir klar. Deshalb habe ich binär ja auch als Alternative in Klammern geschrieben. Das sollte nur heißen 'Wenn jemand ein entsprechendes Programm binär schreiben kann, dann muss er es nicht in hexadezimal umschreiben.'
Die Gründe, warum ich nicht Assembler möchte, sind erstens, dass ich mich dann wieder in einen Assemblers einarbeiten muss, zweitens möchte ich so systemnah wie möglich programmieren und drittens möchte ich auch irgendwann mal *.exe oder andere Dateien lesen können, ohne sie zu disassemblieren (was mit nicht *.exe Dateien ja auch gar nicht funktioniert, oder?)

NicoDE 20. Okt 2005 15:11

Re: Maschinensprache
 
Zitat:

Zitat von Dussel
drittens möchte ich auch irgendwann mal *.exe oder andere Dateien lesen können, ohne sie zu disassemblieren

Wie soll das in der Praxis aussehen?

Zitat:

Zitat von Dussel
(was mit nicht *.exe Dateien ja auch gar nicht funktioniert, oder?)

Warum nicht? Prozessoranweisungen sind Prozessoranweisungen...

tommie-lie 20. Okt 2005 15:12

Re: Maschinensprache
 
Zitat:

Zitat von Dussel
Die Gründe, warum ich nicht Assembler möchte, sind erstens, dass ich mich dann wieder in einen Assemblers einarbeiten muss

In die Architektur musst du dich sowieso einarbeiten. Nur wirst du dir die Opcodes vermutlich nicht so leicht merken können, wie die Mnemonics dazu. Und Address-Relocation auf Labels ist auch sehr viel angenehmer, als das Abzählen im Kopf.

Zitat:

Zitat von Dussel
zweitens möchte ich so systemnah wie möglich programmieren

Diesen Ehrgeiz in allen Ehren, aber Assembler ist systemnah genug um landläufig als das geekigste Lebewesen ver known zu gelten.

Zitat:

Zitat von Dussel
drittens möchte ich auch irgendwann mal *.exe oder andere Dateien lesen können, ohne sie zu disassemblieren

Oha, also mehrere hunderttausend Byte einfach mal so lesen, nur indem du nir die Zahlen anschaust. Wenn du das Ziel erreicht hast: Rehspeck! Du weißt aber schon, daß es mehr als hundert verschiedene Mnemonics gibt, die auch noch je nach Parameter völlig verschiedene Opcodes haben können, während sie für den menschen inhaltlich fast gleich sind? Es gibt einen Grund, warum auf modernen Architekturen sich niemand mehr für Opcodes interessiert.

Zitat:

Zitat von Dussel
(was mit nicht *.exe Dateien ja auch gar nicht funktioniert, oder?)

Stimmt, ein BMP-Bild habe ich noch nicht disassemblieren können, ich weiß einfach nicht, was ich falsch mache.

Zitat:

Zitat von Dussel
Kann mir jemand sagen, wie das 'hello world' Programm (als hexadezimales Programm) betriebssystemunabhängig aussieht? Im Tutorial steht es als Assembler, ich hätte es aber lieber in Hexadezimal (oder binär) programmiert.

Falls du damit mein Programm meinst: Assembliere es mit GAS und betrachte das Resultat in einem Hexeditor oder schreibe es mit bin2hex in eine Textdatei.

MaBuSE 20. Okt 2005 17:00

Re: Maschinensprache
 
Zitat:

Zitat von Dussel
Die Gründe, warum ich nicht Assembler möchte, sind erstens, dass ich mich dann wieder in einen Assemblers einarbeiten muss, zweitens möchte ich so systemnah wie möglich programmieren und drittens möchte ich auch irgendwann mal *.exe oder andere Dateien lesen können, ohne sie zu disassemblieren (was mit nicht *.exe Dateien ja auch gar nicht funktioniert, oder?)

Lies das hier mal bitte durch:
Wofür eignet sich Assembler?

Du kannst also alle Hex Codes der Mnemonics auswendig lernen und dann kannst Du auch im Kopf Maschienensprache lesen.

Eine kleine Auswahl an Assemblerbefehlen (inkl. Maschienencode) findest Du hier:
http://de.wikibooks.org/wiki/Assembl...efehlsreferenz

Hier ist eine etwas vollständigere Liste der Befehle, aber ohne die entsprechenden Maschienencodes:
http://moab.eecs.wsu.edu/~ee314/handouts/x86ref.pdf

Viel Spaß ;-)

Speedmaster 20. Okt 2005 17:38

Re: Maschinensprache
 
Zitat:

Zitat von Dussel
Dass binär und hexadezimal das gleiche ist, ist mir klar. Deshalb habe ich binär ja auch als Alternative in Klammern geschrieben. Das sollte nur heißen 'Wenn jemand ein entsprechendes Programm binär schreiben kann, dann muss er es nicht in hexadezimal umschreiben.'
Die Gründe, warum ich nicht Assembler möchte, sind erstens, dass ich mich dann wieder in einen Assemblers einarbeiten muss, zweitens möchte ich so systemnah wie möglich programmieren und drittens möchte ich auch irgendwann mal *.exe oder andere Dateien lesen können, ohne sie zu disassemblieren (was mit nicht *.exe Dateien ja auch gar nicht funktioniert, oder?)

Das finde ich schwachsinn!

Auch wenn die Gefahr besteht das mich ein Mod umbringt:
Wozu in Maschienencode Programmieren wenn es Hex gibt, und wozu in Hex Programmieren wenn es ASM gibt, und wozu in ASM Programmieren wenn es Hochsprachen gibt( Auch die in verschiedenen Generationen )?

Du kannst genauso anfangen deinen Prozessor selber zusammenbauen, und das ist allergrößter Schwachsinn!
Nicht umsonst hat man asm und Hochsprachen eingeführt, die einzigen die vielleicht heute noch mit HEX und Maschienencode zu tun haben sind wohl die Entwickler von Prozessoren die neue Befehle einführen( Stichwörter: MMX, SSE , 3DNOW ), und selbst dort haben sie denke ich sicherlich geeignete Tools und Geräte um sich das leben leichter zu machen!

Selbst Betriebssysteme lassen sich mit mit einer Hochsprache und einem Speziellen Compiler entwickeln( Ob die Basis auch damit Entwickelt wird ist Fraglich, aber ich hatte mal einen Link wo drinstand wie es geht )!

Um es kürzer auszudrücken: Du kannst auch gleich mit einem Stock gegen einen Panzer anrennen, weit kommst du damit nicht! Wenn dir Delphi nicht gefällt such dir >>hier<< eine Sprache aus, oder versuchs mal mit Brainf*ck!

hf & gl

tommie-lie 20. Okt 2005 18:11

Re: Maschinensprache
 
Zitat:

Zitat von Speedmaster
Wozu in Maschienencode Programmieren wenn es Hex gibt

Allein durch diesen Halbsatz disqualifizierst du dich eigentlich schon :mrgreen:

Zitat:

Zitat von Speedmaster
und wozu in ASM Programmieren wenn es Hochsprachen gibt( Auch die in verschiedenen Generationen )?

Um die Architektur zu verstehen und weil man einige Dinge in Assembler besser gebacken kriegt als in mittelmäßigen Hochsprachen.

Zitat:

Zitat von Speedmaster
Du kannst genauso anfangen deinen Prozessor selber zusammenbauen, und das ist allergrößter Schwachsinn!

Wieso? Vielleicht kommt ja ein CISC bei raus :mrgreen:

Zitat:

Zitat von Speedmaster
die einzigen die vielleicht heute noch mit HEX und Maschienencode zu tun haben sind wohl die Entwickler von Prozessoren die neue Befehle einführen( Stichwörter: MMX, SSE , 3DNOW ), und selbst dort haben sie denke ich sicherlich geeignete Tools und Geräte um sich das leben leichter zu machen!

Stimmt, die Tools nennen sich "Assembler".

Zitat:

Zitat von Speedmaster
Selbst Betriebssysteme lassen sich mit mit einer Hochsprache und einem Speziellen Compiler entwickeln( Ob die Basis auch damit Entwickelt wird ist Fraglich, aber ich hatte mal einen Link wo drinstand wie es geht )!

Mit einer normalen Hochsprache kriegst du kein Betriebssystem hin.

Speedmaster 20. Okt 2005 19:45

Re: Maschinensprache
 
Zitat:

Zitat von tommie-lie
Mit einer normalen Hochsprache kriegst du kein Betriebssystem hin.

Soso, C++ zählt also nicht zu einer Hochsprache? Sicherlich, um asm kommst du nicht rum, aber eine Hochsprache ist C++ trotzdem! Zudem sagte ich ja mit einem Speziellen kompiler, habe natürlich vergessen zu sagen das man auch Spezielle Libs braucht!

Zitat:

Zitat von tommie-lie
Um die Architektur zu verstehen und weil man einige Dinge in Assembler besser gebacken kriegt als in mittelmäßigen Hochsprachen.

Hmm, das kann sein( Wenn nicht umbedingt .NET im Spiel ist ), allerdings ist der Geschwindigkeitsunterschied nicht so krass, und du Programmierst mit einer Hochsprache mit großer Wahrscheinlichkeit schneller( Gibt natürlich Leute wie uall )!

tommie-lie 20. Okt 2005 19:56

Re: Maschinensprache
 
Zitat:

Zitat von Speedmaster
Sicherlich, um asm kommst du nicht rum

Danke daß du mir zustimmt, so what?
Allen mir bekannten Hochsprachen fehlen Sprachelemente um bestimmte Dinge zu machen, die in einem Betriebssystem zwingend notwendig sind, ein Betriebssystem lässt sich also nicht mit einer der bekannten Hochsprachen möglich, sondern man benötigt einige tausend Zeilen Assembler dafür. Daß der weitaus größere Teil aktueller Betriebssysteme in einer Hochsprache geschrieben ist, zweifele ich ja nicht im geringsten an, ich weiß nämlich, daß es so ist.

Zitat:

Zitat von Speedmaster
allerdings ist der Geschwindigkeitsunterschied nicht so krass

Kommt auf den Anwendungsfall an. Man ist in Assembler schon mal gerne um Größenordnungen schneller als der Compiler (zumindest geht das beim Delphi-Compiler, ich gebe zu, GCC/C++-Compilate habe ich mir noch nicht angeschaut).

Neotracer64 20. Okt 2005 20:14

Re: Maschinensprache
 
Doch es wäre wirklich möglich ein OS ganz ohne einen Code in Assembly geschrieben zu haben zum laufen zu bringen.

Letztendlich wird doch alles was man in einer Hochsprache programmiert in Maschinencode umgewandelt.

Dussel 20. Okt 2005 20:32

Re: Maschinensprache
 
Um das jetzt mal zu erklären: Ich möchte gerne hexadezimal programmieren lernen, um, wie schon geschrieben, möglichst nah am System zu sein und die Funktionsweise zu lernen. Da ich ein ganz-oder-gar-nicht-Typ bin ist mir halt hexadezimal oder auch binär so wichtig, Assembler ist so eine Zwischenstufe. Es geht mir auch nicht darum damit große Programme zu programmieren, dazu benutze ich Delphi oder C++, aber ich möchte halt auch mal die Anfänge und absoluten Grundlagen kennen lernen.

Dust Signs 20. Okt 2005 20:44

Re: Maschinensprache
 
Zitat:

Zitat von Dussel
Um das jetzt mal zu erklären: Ich möchte gerne hexadezimal programmieren lernen, um, wie schon geschrieben, möglichst nah am System zu sein und die Funktionsweise zu lernen.

[sarkasmus]Dann bau dir am besten eine CPU aus selbstgebauten Transistoren :mrgreen:[/sarkasmus]

Nö, im Ernst: tiefer als Assembler hat keinen wirklichen Sinn. Programmier mal ein paar Monate Assembler auf einem Mikrocontroller (8086 z.B.)... und dann schreib uns wieder falls du "hexadezimal" programmieren willst :mrgreen:

Dust Signs

Tubos 20. Okt 2005 20:53

Re: Maschinensprache
 
Zitat:

Doch es wäre wirklich möglich ein OS ganz ohne einen Code in Assembly geschrieben zu haben zum laufen zu bringen.

Letztendlich wird doch alles was man in einer Hochsprache programmiert in Maschinencode umgewandelt.
Ja, aber selbst in systemnahen Sprachen wie C kannst du keine Eingabe/Ausgabe machen. Schon mal probiert einen Text mit C auszugeben? Na, was machst du?
Entweder Betriebssystem ansteuern oder - wenn du eben eins programmierst - Assembler-Code einbinden.

tommie-lie 20. Okt 2005 21:18

Re: Maschinensprache
 
Zitat:

Zitat von Tubos
[...]

Er hat schon nicht gelesen, was ich geschrieben habe. Wenn er dir jetzt diesen Gefallen tut, fühle ich mich diskriminiert! :mrgreen:

Zitat:

Zitat von Dust Signs
Mikrocontroller (8086 z.B.)

Den 8086 würde ich als Großvater eines Pentium4 nicht mehr in die Kategorie Microkontroller einreihen. Und bevor ich mir die Mühe mache und auf der Suche nach so einem Prachtexemplar (wir haben noch einen im Keller, ätschbätsch (ich weiß nur nicht, ob der noch funktioniert...)) die Füße wundlaufe, nehm' ich mir doch gleich einen x86-Emulator daher ;-)

Olli 20. Okt 2005 21:32

Re: Maschinensprache
 
Zitat:

Zitat von NicoDE
Zitat:

Zitat von Dussel
drittens möchte ich auch irgendwann mal *.exe oder andere Dateien lesen können, ohne sie zu disassemblieren

Wie soll das in der Praxis aussehen?

Strings.exe von Sysinternals vermutlich *g*

Beim Lesen dieses Themas fiel mir nur eines ein: Aua! :wall: :mrgreen: :mrgreen:

Aber danke fuer die Ablenkung *g*, schliesslich habe ich jetzt meine erste "Driver License" und meine zweite bekomme ich morgen. Da ist's schoen mal wieder was aus Userland zu lesen :mrgreen:

lizardking 20. Okt 2005 21:34

Re: Maschinensprache
 
Zitat:

Zitat von Dussel
Um das jetzt mal zu erklären: Ich möchte gerne hexadezimal programmieren lernen, um, wie schon geschrieben, möglichst nah am System zu sein und die Funktionsweise zu lernen. Da ich ein ganz-oder-gar-nicht-Typ bin ist mir halt hexadezimal oder auch binär so wichtig, Assembler ist so eine Zwischenstufe.

Du lernst bei Assembler mehr ueber die Funktionsweise eines Prozessors, als wenn Du Dich mit Nullen und Einsen rumschlaegst. Wenn Du ganz an die Basis willst, dann musst Du Dich mit Sachen wie Rechenwerk, Steuerwerk etc beschaeftigen. Und selbst dann muesstest Du noch tiefer in die Materie gehen und Dich drum kuemmern, wie Befehle dekodiert werden, wie Steuer-, Adress- und Datenleitungen dadurch belegt werden. Von Pipelining und im Falle von CISC-Prozessoren unterschiedlicher Opcode-Laenge mal ganz zu schweigen.
Wie ein Vorredner schon schrieb : Ehrgeiz in allen Ehren. Super. Aber ich bezweifel bzw. wage sogar die Behauptung, dass nicht ein einziger Entwickler heutiger Prozessoren das kann, was Du zu lernen vor hast (welch komplizierter Satzbau *g*).

Zitat:

Zitat von Tubos
Schon mal probiert einen Text mit C auszugeben? Na, was machst du?
Entweder Betriebssystem ansteuern oder - wenn du eben eins programmierst - Assembler-Code einbinden.

*moep* Falsch. Programmier mal Mikroprozessoren. Da gibt es erstmal kein Betriebssystem. Und es geht ohne Assembler. Ich hab selbst mal in 'nem Projekt ein entsprechendes Betriebssystem programmiert. Inklusive einer Art Task-Scheduler, Ausgaben etc. pp.. Es geht. Ein OS wie Windows oder auch nur DOS ist ohne Assembler sicherlich nicht ohne Weiteres machbar, aber es ist machbar ;-)

Gruss, Lizzy

Rastaman 20. Okt 2005 21:38

Re: Maschinensprache
 
Ich glaub du stellst dir das so einfach vor.
Hab ich auch: NASM runtergeladen, NASM IDE geladen und ein Beispielprogramm angesehn.
Hab NASM sofort wieder gelöscht.

Vergiss es einfach! Oder kannst du mir sagen warum der Befehl

Code:
mov ax, $0013
in den 320x200x256 VGA mode schaltet? Wohl nicht, und ich glaube auch nicht, dass du den Befehl in Hex übersetzen kannst :mrgreen:

Hier mal der gesamte Code:

Code:
; Information
; ßßßßßßßßßßß
;
; Program Title : NASM-IDE Copper Bars Demo
; External name : BAR.COM
; Version      : 1.1
; Start date   : 18/12/1997
; Last update  : 02/01/2002
; Author       : Rob Anderton
; Copyright    : (c)1997 Rob Anderton
; Description  : An example of a copper bars effect programmed using
;                 NASM-IDE 1.5 and NASM 0.98.08.
;
;                 Based on code by Patch (hamell@rigel.cs.pdx.edu)
;                 (written using TASM) dated 4/9/93.


bits 16                      ; Set 16 bit code generation
org 0x0100                   ; Set code start address to 100h (COM file)

; Variables are at the end of this file

SECTION .text               ; Text section containing code

START:  mov ax, $0013      ; Set 320x200x256 VGA mode 13h
         int $10

         in  al, $21        ; Get IRQ mask
         mov [IRQSave], al ; Save it
         mov al, 11111101b ; Mask all but keyboard off
         out $21, al       ; Set new IRQ mask
         in  al, $0A1       ; Get NMI mask
         mov [NMISave], al ; Save it
         mov al, 11111111b
         out $0A1, al      ; Set new NMI mask

         mov dx, $03C8
         mov al, 01h
         out dx, al
         xor al, al
         inc dx
         out dx, al
         out dx, al
         out dx, al

         mov ax, $0A000
         mov es, ax

         xor di, di
         mov ax, $0101
         mov cx, 32000
         cld
         rep stosw

         push ds
         pop es
         mov bx, BarLine

STARTBAR:

         cli                ; Don't poll keyboard
         mov si, Palette   ; Set up pointer
         mov bp, $01        ; Bar number = 1

PALSETUP:

         push bp
         mov di, [bx]
         mov al, [SinTable + di] ; Top bar line

         mov di, BarPal
         dec al            ; Decrement for 0th index element
         xor ah, ah        ; Clear high byte
         mov cx, ax
         shl ax, 1
         add ax, cx
         add di, ax
         add di, ax
         mov bp, BarPriority
         add bp, cx           ; Set to proper spot in priority check
         mov cx, [BarHeight]

CHECKLINE:

         cmp   BYTE [bp], $00  ; Is the line empty?
         jne   NODRAWLINE     ; If not, jump
         mov   BYTE [bp], $01  ; It's full now
         movsw
         movsb
         sub   si, 3
         movsw
         movsb
         jmp   NEXTPRIORITY

NODRAWLINE:

         add si, 3          ; Increment palette pointer
         add di, 6          ; Increment bar palette

NEXTPRIORITY:

         inc bp            ; Next priority line
         loop CHECKLINE

BARSPOT:

         add WORD [bx], $03    ; Increment table index
         cmp WORD [bx], 359    ; End of table?
         jle NEXTBAR

RESETBARSPOT:

         mov WORD [bx], $00    ; reset table index

NEXTBAR:

         pop bp               ; Restore bar num
         inc bx               ; Next bar line address
         inc bx               ; Word size = + 2
         inc bp               ; Increment bar counter

         cmp bp, [BarCount]   ; Bar count at max?
         jle PALSETUP         ; If <= , go back

         mov si, BarPal
         mov cx, 400

         mov dx, $03DA        ; Setup Input Status 1 reg

VRETRACE:

         in  al, dx
         test al, 00001000b    ; Test bit 3, vertical retrace
         jnz VRETRACE         ; If active, go back

VNORETRACE:

         in  al, dx
         test al, 00001000b    ; Test bit 3, vertical retrace
         jz  VNORETRACE       ; If active, go back

PALDUMP:

         mov  al, $01
         mov  dx, $03C8
         out  dx, al
         inc  dx
         outsb                 ; Dump it out
         outsb
         mov  dx, $03DA

PUCK1:

         in  al,dx
         test al, 00000001b
         jz  PUCK1

         mov dx, $03C9
         outsb

         mov dx, $03DA         ; Setup Input Status 1 reg

HRETRACE:

         in  al, dx
         test al, 00000001b     ; Test bit 1, horizontal retrace
         jnz HRETRACE          ; If not active, go back

HNORETRACE:

         in  al, dx
         test al, 00000001b     ; Test bit 1, horizontal retrace
         jz  HNORETRACE        ; If active, go back;

         mov dx, $03DA
         loop PALDUMP

         mov di, BarPriority
         mov cx, 100            ; 100 of them WORD sized
         xor ax, ax            ; AH = 0, AL = 0
         rep stosw             ; Zero them all out

         mov di, BarPal
         mov cx, 600
         xor ax, ax
         rep stosw

         sub bx, [BarCount]     ; Reset bar line address
         sub bx, [BarCount]     ; Twice for word size

         sti                     ; Poll keyboard
         mov ah, $01
         int $16
         jnz EXIT
         jmp STARTBAR

EXIT:

         mov al, [IRQSave]      ; Get old IRQ mask
         out $21, al            ; Restore IRQ mask
         mov al, [NMISave]      ; Get old NMI mask
         out $0A1, al           ; Restore NMI mask
         mov ax, $0003
         int $10
         mov ax, $4C00
         int $21


section .data   ; Initialised variables

; SinTable - holds top to bottom and bottom to top palette values

SinTable db   1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2
          db   3,  3,  3,  4,  4,  5,  5,  6,  6,  7,  7,  8
          db   8,  9, 10, 11, 11, 12, 13, 14, 14, 15, 16, 17
          db  18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30
          db  31, 32, 33, 35, 36, 37, 38, 40, 41, 42, 44, 45
          db  46, 48, 49, 51, 52, 54, 55, 57, 58, 60, 61, 63
          db  64, 66, 67, 69, 70, 72, 73, 75, 77, 78, 80, 81
          db  83, 84, 86, 88, 89, 91, 93, 94, 96, 97, 99, 101
          db 102, 104, 105, 107, 108, 110, 112, 113, 115, 116, 118, 119
          db 121, 122, 124, 125, 127, 128, 130, 131, 133, 134, 136, 137
          db 138, 140, 141, 143, 144, 145, 147, 148, 149, 150, 152, 153
          db 154, 155, 156, 158, 159, 160, 161, 162, 163, 164, 165, 166
          db 167, 168, 169, 170, 171, 171, 172, 173, 174, 174, 175, 176
          db 177, 177, 178, 178, 179, 179, 180, 180, 181, 181, 182, 182
          db 182, 183, 183, 183, 184, 184, 184, 184, 184, 184, 184, 184
          db 184, 184, 184, 184, 184, 184, 184, 184, 184, 183, 183, 183
          db 182, 182, 182, 181, 181, 180, 180, 179, 179, 178, 178, 177
          db 177, 176, 175, 174, 174, 173, 172, 171, 171, 170, 169, 168
          db 167, 166, 165, 164, 163, 162, 161, 160, 159, 158, 156, 155
          db 154, 153, 152, 150, 149, 148, 147, 145, 144, 143, 141, 140
          db 139, 137, 136, 134, 133, 131, 130, 128, 127, 125, 124, 122
          db 121, 119, 118, 116, 115, 113, 112, 110, 108, 107, 105, 104
          db 102, 101, 99, 97, 96, 94, 93, 91, 89, 88, 86, 84
          db  83, 81, 80, 78, 77, 75, 73, 72, 70, 69, 67, 66
          db  64, 63, 61, 60, 58, 57, 55, 54, 52, 51, 49, 48
          db  47, 45, 44, 42, 41, 40, 38, 37, 36, 35, 33, 32
          db  31, 30, 29, 27, 26, 25, 24, 23, 22, 21, 20, 19
          db  18, 17, 16, 15, 14, 14, 13, 12, 11, 11, 10,  9
          db   8,  8,  7,  7,  6,  6,  5,  5,  4,  4,  3,  3
          db   3,  2,  2,  2,  1,  1,  1,  1,  1,  1,  1,  1

Palette        db      7, 7, 7                        ; gray bar start
                db     10,10,10
                db     13,13,13
                db     16,16,16
                db     19,19,19
                db     22,22,22
                db     25,25,25
                db     28,28,28
                db     31,31,31                        ; middle
                db     28,28,28
                db     25,25,25
                db     22,22,22
                db     19,19,19
                db     16,16,16
                db     13,13,13
                db     10,10,10
                db      7, 7, 7                        ; gray bar end
                db      7, 0, 0                        ; red bar start
                db     10, 0, 0
                db     13, 0, 0
                db     16, 0, 0
                db     19, 0, 0
                db     22, 0, 0
                db     25, 0, 0
                db     28, 0, 0
                db     31, 0, 0                        ; middle
                db     28, 0, 0
                db     25, 0, 0
                db     22, 0, 0
                db     19, 0, 0
                db     16, 0, 0
                db     13, 0, 0
                db     10, 0, 0
                db      7, 0, 0                        ; red bar end
                db      0, 7, 0                        ; green bar start
                db      0,10, 0
                db      0,13, 0
                db      0,16, 0
                db      0,19, 0
                db      0,22, 0
                db      0,25, 0
                db      0,28, 0
                db      0,31, 0                        ; middle
                db      0,28, 0
                db      0,25, 0
                db      0,22, 0
                db      0,19, 0
                db      0,16, 0
                db      0,13, 0
                db      0,10, 0
                db      0, 7, 0                        ; green bar end
                db      0, 0, 7                        ; blue bar start
                db      0, 0,10
                db      0, 0,13
                db      0, 0,16
                db      0, 0,19
                db      0, 0,22
                db      0, 0,25
                db      0, 0,28
                db      0, 0,31                        ; middle
                db      0, 0,28
                db      0, 0,25
                db      0, 0,22
                db      0, 0,19
                db      0, 0,16
                db      0, 0,13
                db      0, 0,10
                db      0, 0, 7                        ; blue bar end
                db      7, 7, 0                        ; yellow bar start
                db     10,10, 0
                db     13,13, 0
                db     16,16, 0
                db     19,19, 0
                db     22,22, 0
                db     25,25, 0
                db     28,28, 0
                db     31,31, 0                        ; middle
                db     28,28, 0
                db     25,25, 0
                db     22,22, 0
                db     19,19, 0
                db     16,16, 0
                db     13,13, 0
                db     10,10, 0
                db      7, 7, 0                        ; yellow bar end
                db      7, 0, 7                        ; purple bar start
                db     10, 0,10
                db     13, 0,13
                db     16, 0,16
                db     19, 0,19
                db     22, 0,22
                db     25, 0,25
                db     28, 0,28
                db     31, 0,31                        ; middle
                db     28, 0,28
                db     25, 0,25
                db     22, 0,22
                db     19, 0,19
                db     16, 0,16
                db     13, 0,13
                db     10, 0,10
                db      7, 0, 7                        ; purple bar end
                db      0, 7, 7                        ; cyan bar start
                db      0,10,10
                db      0,13,13
                db      0,16,16
                db      0,19,19
                db      0,22,22
                db      0,25,25
                db      0,28,28
                db      0,31,31                        ; middle
                db      0,28,28
                db      0,25,25
                db      0,22,22
                db      0,19,19
                db      0,16,16
                db      0,13,13
                db      0,10,10
                db      0, 7, 7                        ; cyan bar end
                db     18, 8, 1                        ; copper bar start
                db     23,13, 5
                db     28,18, 9
                db     33,23,13
                db     38,28,17
                db     43,33,21
                db     48,38,25
                db     53,43,29
                db     58,48,33                        ; middle
                db     53,43,29
                db     48,38,25
                db     43,33,21
                db     38,28,17
                db     33,23,13
                db     28,18, 9
                db     23,13, 5
                db     18, 8, 1                        ; copper bar end

BarLine        dw   175, 150, 125, 100, 75, 50, 25, 0
BarHeight      dw   17
BarCount       dw   8
BarPal         times 400 * 3 db 0
BarPriority    times 200 db 0


section .bss    ; Uninitialised variables

IRQSave resb 1
NMISave resb 1
So :mrgreen:
Wenn du nicht verstehst was das macht, wirst du auch nie einfach eine EXE lesen können :?

tommie-lie 20. Okt 2005 22:00

Re: Maschinensprache
 
Zitat:

Zitat von lizardking
*moep* Falsch. Programmier mal Mikroprozessoren. Da gibt es erstmal kein Betriebssystem. Und es geht ohne Assembler.

In was programmiert man das? In C? Könntest du mir in diesem Fall bitte mal das Makefile oder die Ausgabe von `grep include somefile.c` zukommen lassen?

Zitat:

Zitat von lizardking
Hab NASM sofort wieder gelöscht.

Warum? Der Netwide Assembler ist doch gar nicht so übel.

Zitat:

Zitat von Rastaman
Oder kannst du mir sagen warum der Befehl
Code:
mov ax, $0013
in den 320x200x256 VGA mode schaltet?

Das kann dir niemand erklären, weil dieser Befehl das nicht tut.

[code]mov ax, $0013
int $10 [/quote]Diese beiden Befehle zusammen tun das, und warum sie das tun, ist einfach erklärt. Der Softwareinterrupt 10 kann zur manipulation der Grafikkarte herangezogen werden. In AH steht der Wert 0, das sagt dem Interrupt-Handler, daß ein neuer Videomodus gesetzt werden soll, in AL steht 0x13, das wird interpretiert als 40Zeilen/25Spalten im Textmodus bzw 320x200 Pixel im Graphikmodus, jeweils mit 256 darstellbaren Farben. Und warum ist das so? Weil die Videomodi irgendwann in der grauen Vorzeit mal festgelegt wurden.

Zitat:

Zitat von Olli
Beim Lesen dieses Themas fiel mir nur eines ein: Aua! :wall: :mrgreen: :mrgreen:

Dann hattest du ja nur halb so viel Spaß wie ich :mrgreen:

Rastaman 20. Okt 2005 22:03

Re: Maschinensprache
 
Zitat:

Zitat von tommie-lie

Zitat:

Zitat von Rastaman
Oder kannst du mir sagen warum der Befehl
Code:
mov ax, $0013
in den 320x200x256 VGA mode schaltet?

Das kann dir niemand erklären, weil dieser Befehl das nicht tut.

Is ja super, aber nich jeder kann so toll ASM wie du, und dahinter stand halt der Kommentar.
Deine Beschreibung mag einleuchten, trotzdem würd ich im Leben nich darauf kommen :?

//Edit: Hauptsächlich sollte es auch zur Abschreckung dienen :mrgreen:

Speedmaster 20. Okt 2005 22:19

Re: Maschinensprache
 
Ohne ASM kann man allerdings nur auskommen wenn Bibiliotheken vorhanden sind in dennen Funktionen, Classen & Co drin sind die eine gewisse Basis bilden( mal abgesehen von Sprachen wie C#, aber das ist ein anderes Thema ), und diese sind dann in ASM geschrieben( Guckt euch mal die Delphi Units an die mitgeliefert werden )!

lizardking 20. Okt 2005 22:24

Re: Maschinensprache
 
Zitat:

Zitat von tommie-lie
In was programmiert man das? In C? Könntest du mir in diesem Fall bitte mal das Makefile oder die Ausgabe von `grep include somefile.c` zukommen lassen?

Kann ich Dir nicht zukommen lassen, da ich die Sourcen nicht mehr besitze. Ist aber auch Latte, kann's ja erklaeren :)

In was man programmiert hab ich ja geschrieben : C. Setup war ein Microcontroller, die Ausgabe lief auf 'nem LC-Display, was ueber I^2C oder SPI angeschlossen war (sorry, bin mir nicht mehr ganz sicher, welches Interface). Das ging komplett ueber den gcc (spezielle Version als Cross-Compiler) ohne irgendwelchen Assembler-Code.

Mag sein, dass es Haarspalterei ist, aber es ist definitiv moeglich ein OS ohne Assembler zu entwickeln. Der sinngemaesse Ausspuch "auch C wird in Maschinensprache uebersetzt und deshalb kann man damit ein OS schreiben" hat schon seine Richtigkeit.
Ausschlaggebend dabei ist die Effizienz. Ich hab bei dem besagten Projekt auch teilweise noch Assembler benutzt. Allerdings nicht, weil es mit C nicht funktioniert haette, sondern weil der Code nicht mehr in den Speicher des Microcontrollers gepasst haette.

MaBuSE 21. Okt 2005 07:19

Re: Maschinensprache
 
Zitat:

Zitat von tommie-lie
Zitat:

Zitat von Rastaman
Oder kannst du mir sagen warum der Befehl
Code:
mov ax, $0013
in den 320x200x256 VGA mode schaltet?

Das kann dir niemand erklären, weil dieser Befehl das nicht tut.
Code:
mov ax, $0013
int $10
Diese beiden Befehle zusammen tun das, und warum sie das tun, ist einfach erklärt. Der Softwareinterrupt 10 kann zur manipulation der Grafikkarte herangezogen werden. In AH steht der Wert 0, das sagt dem Interrupt-Handler, daß ein neuer Videomodus gesetzt werden soll, in AL steht 0x13, das wird interpretiert als 40Zeilen/25Spalten im Textmodus bzw 320x200 Pixel im Graphikmodus, jeweils mit 256 darstellbaren Farben. Und warum ist das so? Weil die Videomodi irgendwann in der grauen Vorzeit mal festgelegt wurden.

Das was tommie-lie so schön beschrieben hat (Ich hätte es auch nicht besser schreiben können) ist übrigend das Funktionsprinzip fast aller "Funktionen" in Asm.
Es gibt verschiedene Interupts, die verschiedene Funktionen beinhalten:
z.B.:
Int 10 - Hier sind die "video" (Grafikkarte) Funktionen (vom BIOS bereitgestellt)
Int 13 - Hier sind die "disk I/O services" (vom BIOS bereitgestellt)
Int 21 - Hier sind die "function request services" (von DOS bereitgestellt)

Im Beispielprogramm ist es ja genauso.
[equote="In http://www.delphipraxis.net/internal...=250060#250060 habe ich folgendes geschrieben:"]...
  • Ein Maschinen Programm könnte also wie folgt aussehen:
    EB 0C 68 65 6C 6C 6F 20 77 6F 72 6C 64 24 BA 02 01 B4 09 CD 21 B8 01 4C CD 21
    Dieses Programm gibt auf dem Bildschirm (in der Dos Box) "hello world" aus :mrgreen:
  • Es ist natürlich sehr schwer sich die Befehle in dieser Form zu merken, deshalb wurden für die einzelnen Befehle kleine Kürzel (so genannte mnemonische Symbole, kurz Mnemonics)
    • EB bedeutet JMP (Jump = Springe nach)
    • 0C ist der Parameter von JMP und bedeutet 12 Byte
      -> Der 1. Befehl ist also ein "goto 12 Bytes weiter"
    • 68 65 6C 6C 6F 20 77 6F 72 6C 64 24 ist die hexadezimale Darstellung von "hello world$" (genau 12 Bytes :-))
    • BA bedeutet MOV DX, Wert
    • 02 01 Ist der Wert (Es werden Low und High Byte vertauscht -> Wert = 0102)
      -> MOV DX, 102 -> Dieser Befehl speichert den Wert 0102 in dem Register DX des Prozessors ab
    • B4 bedeutet MOV AH, Wert
    • 09 ist der Wert
      -> MOV AH, 09 -> speichert den Wert 09 im Register AH ab
    • CD bedeutet INT Wert
    • 21 ist der Wert
      -> INT 21 -> ruft den Software Interupt 21 auf
      -> hier wird die DOS Funktion 09 mit Parameter 102 aufgerufen
      -> diese gibt den Text ab Adresse 102 bis zum $ aus
    • B8 bedeutet MOV AX, Wert
    • 01 4C ist der Wert (Es werden Low und High Byte vertauscht -> Wert = 4C01)
      -> MOV AX, 4C01 -> schreibt 4C01 in Register AX
    • CD bedeutet INT Wert
    • 21 ist der Wert
      -> INT 21 -> ruft den Software Interupt 21 auf
      -> hier wird die DOS Funktion 4C 01 aufgerufen
      -> diese beendet das Programm
  • hier noch mal das ganze Listing:
    Code:
    125A:0100 EB0C         JMP    010E
    125A:0102 68656C6C6F20  DB     "hello "
    125A:0108 776F726C6424  DB     "world$"
    125A:010E BA0201        MOV    DX,0102
    125A:0111 B409          MOV    AH,09
    125A:0113 CD21          INT    21
    125A:0115 B8014C       MOV    AX,4C01
    125A:0118 CD21          INT    21
[/equote]

Ich habe die Wichtige Stelle oben im Zitat des Tutorials mal rot markiert

Hier noch mal das ganze Listing mit Kommentaren zu den Funktionsaufrufen:
Code:
125A:0100 EB0C         JMP    010E
125A:0102 68656C6C6F20  DB     "hello "
125A:0108 776F726C6424  DB     "world$"
125A:010E BA0201        MOV    DX,0102     ; Parameter (Adresse des Strings)
125A:0111 B409          MOV    AH,09       ; Dos Funktion No 09 aufrufen (String Ausgabe)
125A:0113 CD21          INT    21          ; In Interupt wird dann obige Funktion ausgeführt
125A:0115 B8014C       MOV    AX,4C01     ; Dos Funktion 4C mit Parameter 01 wird aufgerufen (Programmende)
125A:0118 CD21          INT    21          ; In Interupt wird dann obige Funktion ausgeführt
Zitat:

INT 21,9 - Print String

AH = 09
DS:DX = pointer to string ending in "$"

returns nothing

- outputs character string to STDOUT up to "$"
- backspace is treated as non-destructive
- if ~Ctrl-Break~ is detected, ~INT 23~ is executed
Zitat:

INT 21,4C - Terminate Process With Return Code

AH = 4C
AL = return code (for batch files)

returns nothing

- approved method of program termination
- restores the terminate, ~Ctrl-Break~, and critical error exit
addresses, flushes all buffers, frees memory and returns to
DOS via the termination handler address
- does not close FCBs
- this function is not supported in versions of DOS before 2.x,
so use ~INT 21,0~ or ~INT 20~ to exit.

- see also ~INT 27~ ~INT 21,31~
So funktionierte das damals.
Es gibt Listen mit allen Funktionen der Interupts:
Meine damals verwendete Liste habe ich auf die schnelle nicht mehr gefunden.
Aber hier ist eine andere Liste (ist eigentlich eine Hilfedatei für HelpPC, kann aber auch so gelesen werden):
http://www.arl.wustl.edu/~lockwood/c...errup.txt.html

Zitat:

Zitat von tommie-lie
Zitat:

Zitat von Olli
Beim Lesen dieses Themas fiel mir nur eines ein: Aua! :wall: :mrgreen: :mrgreen:

Dann hattest du ja nur halb so viel Spaß wie ich :mrgreen:

Was ich viel lustiger finde, ist:
Das Thema wurde am 13.10.2004 erzeugt.
am 14.10.2004 habe ich das mini Tutorial geschrieben, dass auch in Tutorials gepostet ist.
am 15.10.2004 war die Diskussion beendet
am 20.10.2005 also gestern also 1 Jahr und 5 Tage später stellt Dussel eine Frage und sofort (ich meine im Millisekundenbereich ;-) ) ist diese Disskusion wieder am leben.

Das finde ich immer wieder lustig :mrgreen:

mh166 21. Okt 2005 08:54

Re: Maschinensprache
 
Zitat:

Zitat von MaBuSE
Was ich viel lustiger finde, ist:
Das Thema wurde am 13.10.2004 erzeugt.
am 14.10.2004 habe ich das mini Tutorial geschrieben, dass auch in Tutorials gepostet ist.
am 15.10.2004 war die Diskussion beendet
am 20.10.2005 also gestern also 1 Jahr und 5 Tage später stellt Dussel eine Frage und sofort (ich meine im Millisekundenbereich ;-) ) ist diese Disskusion wieder am leben.

Das finde ich immer wieder lustig :mrgreen:

:shock: Stimmt ja. :lol: Dann würd mich doch mal interessieren was aus unserem Herrn Ich-will-unbedingt-mit-0-und-1-programmieren geworden ist. :stupid: Ob ers irgendwann doch noch eingesehen hat oder ob er noch dabei is, nen Text-Editor zu schreiben? :mrgreen:

mfg, mh166

MaBuSE 21. Okt 2005 09:05

Re: Maschinensprache
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von MaBuSE
Meine damals verwendete Liste habe ich auf die schnelle nicht mehr gefunden.

Wer suchet, der findet :-)

tommie-lie 21. Okt 2005 09:51

Re: Maschinensprache
 
Zitat:

Zitat von Rastaman
Is ja super, aber nich jeder kann so toll ASM wie du, und dahinter stand halt der Kommentar.

Der Kommentar betraf beide Zeilen und die drei Buchstaben wurden nur nicht auf zwei Zeilen verteilt, weil davon ausgegangen wird, daß den Code jemand liest, der weiß, was er da in den Fingern hält ;-)

Zitat:

Zitat von Rastaman
Deine Beschreibung mag einleuchten, trotzdem würd ich im Leben nich darauf kommen :?

Tja, RTFM, dann wüsstest du's auch.

Zitat:

Zitat von lizardking
In was man programmiert hab ich ja geschrieben : C. [...] Das ging komplett ueber den gcc (spezielle Version als Cross-Compiler) ohne irgendwelchen Assembler-Code.

Sehr schön, und welche clib wurde verwendet und in welcher Sprache sind die lowlevel-Funktionen in selbiger geschrieben? printf() wird es je nach Displaygröße vielleicht nicht in einer brauchbaren Form gegeben haben, aber es gab sicherlich Funktionen, die einzelne Pixel des Displays ansteuern konnten (vorrausgesetzt die Matrix ist überschaubar, bei einem hochauflösenden Display macht sogar printf() Sinn). In C befinden sich solche Funktionen meist in Objektdateien, die in das Binary mitgelinkt werden, und nun rate mal, in welcher Sprache die geschrieben sind.

Zitat:

Zitat von MaBuSE
Das was tommie-lie so schön beschrieben hat ist übrigend das Funktionsprinzip fast aller "Funktionen" in Asm.

"Fast aller" ist relativ. In einem Betriebssystem ohne eigene vollständige Laufzeitumgebung vielleicht (DOS), aber CALL und RET dürfte in einem normalen Programm wohl öfter vertreten sein als INT und IRET ;-)

Zitat:

Zitat von MaBuSE
(Ich hätte es auch nicht besser schreiben können)

Danke für die Blumen ;-)

Zitat:

Zitat von MaBuSE
Es gibt Listen mit allen Funktionen der Interupts:
Meine damals verwendete Liste habe ich auf die schnelle nicht mehr gefunden.
Aber hier ist eine andere Liste

Entweder hier oder im Tutorial-Thread hat Nico schon auf Ralf Browns Liste hingewiesen, die ziemlich komplett ist und die immer wieder gerne als Referenz herangezogen wird: http://www.cs.cmu.edu/~ralf/files.html
Dein Link nach arl.wustl.edu funktioniert ürigens bei mir nicht, traceroute bekommt einen Timeout beim 10. Knoten.

Zitat:

Zitat von MaBuSE
Was ich viel lustiger finde, ist:
[...]
am 20.10.2005 also gestern also 1 Jahr und 5 Tage später stellt Dussel eine Frage und sofort (ich meine im Millisekundenbereich ;-) ) ist diese Disskusion wieder am leben.

Das finde ich immer wieder lustig :mrgreen:

Och, bei diesen Popcorn-Threads ist das doch immer so ;-)


Edit: Noch früh am Morgen... (was bedeutet eigentlich "gegeneben"?)

mh166 21. Okt 2005 10:05

Re: Maschinensprache
 
Zitat:

Zitat von tommie-lie
Zitat:

Zitat von lizardking
In was man programmiert hab ich ja geschrieben : C. [...] Das ging komplett ueber den gcc (spezielle Version als Cross-Compiler) ohne irgendwelchen Assembler-Code.

Sehr schön, und welche clib wurde verwendet und in welcher Sprache sind die lowlevel-Funktionen in selbiger geschrieben? printf() wird es je nach Displaygröße vielleicht nicht in einer brauchbaren Form gegeben haben, aber es gab sicherlich Funktionen, die einzelne Pixel des Displays ansteuern konnten (vorrausgesetzt die Matrix ist überschaubar, bei einem hochauflösenden Display macht sogar printf() Sinn). In C befinden sich solche Funktionen meist in Objektdateien, die in das Binary mitgelinkt werden, und nun rate mal, in welcher Sprache die geschrieben sind.

ICh denke mal, dass es ihm nich darum ging, dass man ein OS coden kann, komplett ohne *irgendwo* ASM zu verwenden. Denn das ist - erwießenermaßen - nicht möglich. Ich glaube vielmehr, dass er meint, dass man ein OS coden kann ohne *selber* ASM verwenden zu müssen, d.h. dass es in diesem Sinne durchaus OK is, wenn in irgendner Lib - gezwungenermaßen - ASM verwendet wird.

mfg, mh166

tommie-lie 21. Okt 2005 10:18

Re: Maschinensprache
 
Zitat:

Zitat von mh166
ICh denke mal, dass es ihm nich darum ging, dass man ein OS coden kann, komplett ohne *irgendwo* ASM zu verwenden. Denn das ist - erwießenermaßen - nicht möglich. Ich glaube vielmehr, dass er meint, dass man ein OS coden kann ohne *selber* ASM verwenden zu müssen, d.h. dass es in diesem Sinne durchaus OK is, wenn in irgendner Lib - gezwungenermaßen - ASM verwendet wird.

Klar, mit der Komponente TOperatingSystem kannst du auch in Delphi ein Betriebssystem schreiben :mrgreen:

MaBuSE 21. Okt 2005 10:23

Re: Maschinensprache
 
Zitat:

Zitat von tommie-lie
Zitat:

Zitat von MaBuSE
Es gibt Listen mit allen Funktionen der Interupts:
Meine damals verwendete Liste habe ich auf die schnelle nicht mehr gefunden.
Aber hier ist eine andere Liste

Entweder hier oder im Tutorial-Thread hat Nico schon auf Ralf Browns Liste hingewiesen, die ziemlich komplett ist und die immer wieder gerne als Referenz herangezogen wird: http://www.cs.cmu.edu/~ralf/files.html

Das war auch die die ich verwedet habe :-)
In meinem Letztem Beitrag ist die Liste (als >6MByte großes AsciiTextfile) zu finden.
Die hatte vorallem auch die undokumentierten Funktionen aufgelistet. (z.B. die von auf dem System aktiven Viren ;-) )

schöni 21. Okt 2005 10:51

Re: Maschinensprache
 
Zitat:

Zitat von tommie-lie
Klar, mit der Komponente TOperatingSystem kannst du auch in Delphi ein Betriebssystem schreiben

Prinzipiell schon. Aber das müsste dann eher eine Komponentensammling sein, die da wäre:

TPCEmulator -> um den Zielrechner zu simulieren (gibt's mit Boch's als OpenSource)
TBiosChip -> Damit der Rechner weiß, was er nach dem Einschalten als Erstes tun muß
TBootDisk -> mit eingelagertem HexEditor für die Bootsequenz (Zumm Booten des Systems)
TGraphicCard -> Ein Grafikadapter zum Anzeigen der Systemausgaben
TMonitor -> Erst hier wären die Ausgaben wirklich zu sehen
TCDROM -> CD-Laufwerk nur lesen
TCDRW -> CD-Laufwerk mit Brenner
(vielleicht reicht hier im Design auch ne Eigenschaft, die die Art des CD-Laufwerkes beschreibt, als nur Lesen, Lesen/schreiben)
TDVD -> DVD Laufwerk

Das Formular müßte zuerst den PCEmulator aufnehmen, dann folgen die anderen Komponenten, die gemäß der Hardware-Konfiguration über passende Eigenschaften zusammengeschlossen werden. Danach folgt der Software Teil. Dafür müssen geeigete Speicherplätze in den KOmponenten vorhanden sein.

In einer PCEmulator Komponente könnte man die Befehllssätze verschiedene CPU's definieren und als Eigenschaft im OI dann einen auswählen. Wie beschreibt man so einen Befehlssatz? Entweder mit einer Tabelle mit allen möglichen Befehlskombinationen. Oder mit speziellen Beschreibungssprachen, falls es sowas gibt. Intel und AMD müssen ja den Befehlssatz für Ihre CPU's auch irgendwo beschreiben. Und VMWare auch.

Zum Grafikadapter:

Ich kenne VMWare. Dort wünschte ich mir eine Hardwarenähere Simulation meiner physikalischen GK
Praktisch ein Wrappen auf meine echte. Da aber der Grafikadapter in VMWare sehr langsam ist, gehe ich davon aus, das alle Funktionen der GK softwaremäßig perfekt nachgebildet sind, statt dort im Gegensatz zu den übrigen PC Komponenten auf die physikalische GK zurückzugreifen.


Sinnvoll wäre das Ganze schon. Aber wer entwickelt die Komponenten? Dürfte einigen Aufwand bedeuten!

schöni

tommie-lie 21. Okt 2005 11:20

Re: Maschinensprache
 
Zitat:

Zitat von MaBuSE
In meinem Letztem Beitrag ist die Liste (als >6MByte großes AsciiTextfile) zu finden.

http://www.delphi-forum.de/images/smiles/icon_lupe.gif Den Beitrag habe ich glatt ignori^Wübersehen :mrgreen:

Schöni, ich weiß nicht, ob du die Ironie in meinem Beitrag nicht erkannt hast, oder ob ich jetzt deine nicht erkenne. :gruebel:
Komponenten zur Emulation eines Computer sind nicht notwendig, als vollständigen x86-Emulator hat man ja Bochs, wenn das Betriebssystem erstmal funktioniert. Neben TOperatingSystem bräuchte man nur noch TMarketDominance (aus Microsoft-internen Kreisen wurde mit bekannt, daß Microsoft bereits an einer Ableitung dieser Klasse arbeitet, TWorldDominance).

Zitat:

Zitat von schöni
In einer PCEmulator Komponente könnte man die Befehllssätze verschiedenee CPU's definieren und als Eigenschaft im OI dann einen auswählen.

Braucht's nich, der dcc kompiliert eh nur nach IA32. Wenn man die Fließkommaerweiterungen von AMD außen vor lässt reicht ein Pentium4 für alles bisher dagewesene.

Zitat:

Zitat von schöni
Intel und AMD müssen ja den Befehlssatz für Ihre CPU's auch irgendwo beschreiben. Und VMWare auch.

VMware nimmt einfach die physikalisch vorhandene CPU daher, die machen sich gar nicht die Mühe, den Prozessor zu virtualisieren.

Zitat:

Zitat von schöni
Ich kenne VMWare. Dort wünschte ich mir eine Hardwarenähere Simulation meiner physikalischen GK

ACK (man will ja mit normaler Geschwindigkeit mit Managed DirectX rumspielen :zwinker:). Aber Workstation 5 hat ja immerhin eine experimentelle Unterstützung für Direct3D.


Disclaimer: Dieser Beitrag kann nicht unwesentliche Mengen nicht ernstgemeinten Textes enthalten. Der Autodieses Beitrags bittet um Verständnis und schließt sämtliche Rechtsansprüche auf durch Ironie oder Srakasmus entstandene Schäden aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:52 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz