![]() |
Maschinensprache
Ich habe mal eine total verrückte Frage :
Kann man Programme in Maschinensprache programmieren, also im Binärsystem ? Und wie macht man sowas ? Einfach in eine Textdatei
Delphi-Quellcode:
schreiben und als Exe-Datei speichern ?
001010100111000110
101010110110001100 010000111001011101 |
Re: Maschinensprache
das ganze nennt sich assembler!
es gibt auch assembler für windows du selbst brauchst nicht in 0en und 1en schreiben, sondern kannst z.b. MOV R16 R17 oder so schreiben das wird dann vom assembler in einen Maschinencode aus 0en und 1en umgewandelt um eine exe daraus zu machen musst du es noch compilieren |
Re: Maschinensprache
Ich will aber 1en und 0en schreiben :mrgreen:
|
Re: Maschinensprache
Zitat:
Ist es möglich? Ja. Macht es wer? Nur extrem talentierte oder total verrückte. Warum macht es heutzutage noch jemand? Keine Ahnung :mrgreen: ...:cat:... |
Re: Maschinensprache
Man kann. Wenn du die Textdatei mit Nullen und Einsen schreibst, wirst du allerdings eine Datei mit den ANSI-Codes der Nullen und Einsen erhalten. Die Nullen und Einsen sind ohnehin nur eine etwas bildliche Größe. Was du machen müsstest, ist einen Editor öffnen, der Binärdateien berbeiten hann (es bäte sich ein Hexeditor an, aber ein Texteditor, der mit dem gesamten ASCII-Zeichensatzumgehen kann, täte es auch) und dann byteweise die Instruktionen und deren Parameter schreiben.
Weil das unheimlich umständlich und sehr schwer handzuhaben ist, benutzt man meistens Assembler. Dort schreibt man die Opcodes und deren Parameter in einem menschenlesbaren Format, hat aber genau dieselben Möglichkeiten wie beim direkten binären Programmieren. [edit]Etwas langsam, naja...[/edit] |
Re: Maschinensprache
Oh... ich fürchte das ist doch etwas umständlicher als ich gedacht hab ^^
|
Re: Maschinensprache
Zitat:
...:cat:... |
Re: Maschinensprache
Moin Neutral General,
mal abgesehen vom Aufwand: Such' Dir erst mal etwas, wo Du es nutzen könntest. Das wären dann, vielleicht, ein Zuse oder ein ENIAC Simulator (falls es so etwas gibt :gruebel: ) |
Re: Maschinensprache
Zitat:
Schau doch mal wie groß denn so die Programme (*.exe) auf deinem Rechner sind. Wenn eine Project2.exe 512 kByte hat (also 0,5 MB) dann sind dass 512 * 1024 Bytes. Ein Byte hat 8 Bit. Also hätte eine Exe mit 0,5 MByte 4.194.304 Einsen und Nullen. Wie lange braucht man um über 4 Mio Einsen und Nullen zu tippen :mrgreen: -gut- es gibt auch kleinere Programme ;-), aber 0,5 MB ist keine Seltenheit. |
Re: Maschinensprache
Maschinencode is doch nich das selbe wie Assembler. Assembler hat ja schon n paar befehle, aber maschinencode is wirklich nur "strom da" und "strom nich da" (1 bzw 0)... Oder hab ich da mal wieder nich aufgepasst? ^^
|
Re: Maschinensprache
Liste der Anhänge anzeigen (Anzahl: 1)
Für den Kameraden hier habbich was gefunden :mrgreen:
|
Re: Maschinensprache
Es hat doch niemand was anderes gesagt :gruebel:
Ich hab übrigens mal etwas weiter gerechnet (Wahrscheinlich hab ich mich wiedermal verrechnet): Angenommen, man weiß genau, was man tippen will (man hat also auswendig die von MaBuSe errechneten 4.194.304 Nullen und Einsen im Kopf) und tippt pro Sekunde (gerade im Eigenversuch probiert) 6 Ziffern, also 21600 pro Stunde, benötigt man für die 4 Mio Nullen und Einsen gerade mal 194 Stunden, also 8,x Tage. Problematisch wird das ganze, wenn man zwischen jeder 0 und 1 noch 5 Sekunden Pause zum Überlegen machen muss :mrgreen: Man liest sich, Stanlay :hi: |
Re: Maschinensprache
Zitat:
Zu einem Zeitpunkt, zu dem man nichts weiter hat als einen nackten Prozessor (mit Peripherie aber ohne irgendwelche Software) kann man mit Maschinensprache anfangen, aber eben nicht mit Assembler. Grüsse Woki |
Re: Maschinensprache
Zitat:
Also...
So das sollte als Info reichen. Viel Spaß Dr. MaBuSE ps: ich werde das auch nach Tutorial posten :mrgreen: |
Re: Maschinensprache
Hier kann man noch etwas mehr dazu lesen:
|
Re: Maschinensprache
Notfalls könnte man auch ein Delphi Programm schreiben, das 8 Nullen oder Einsen in das entsprechende Byte umrechnen und so dann Maschinencode erzeugen.
Inwieweit das aber Sinnvoll ist, sei dahingestellt, zumal Verglichen mit Maschinencode ist Assembler noch die schönste "Hochsprache" (finde ich) |
Re: Maschinensprache
Zitat:
|
Re: Maschinensprache
Zitat:
Aber ich halte es für extrem sinnlos, in Maschinensprache zu proggen wenn es doch Assembler gibt... |
Re: Maschinensprache
Solly,
Assembler ist halt nicht so schön zu lesen wie Pascal oder C++, aber ich glaube ,dass es keinen Sinn machen würde, ein Pro zu schreiben, das alles in 0 und 1 umwandelt. Assembler ist auserdem schon durchgetestet. warum also arbeit machen? |
Re: Maschinensprache
Bitteeeee... ich will nur mal ausprobieren ob das funktioniert :stupid:
Nur einen kleinen Ansatz... |
Re: Maschinensprache
Sicher funktioniert es, die Programme machen ja auch nicht mehr als nullen und einsen zu erzeugen. Dafür musst du dich aber schwer einlesen.
|
Re: Maschinensprache
-->
![]() Schreibe einen Hexeditor, und dann kannst du immer noch Einser und Nullen in das Hexadezimalsystem umrechnen, wenn du noch tiefer gehen willst. |
Re: Maschinensprache
Hallo,
ich wurde folgendes gefragt: Zitat:
![]() gefunden mit: ![]() Viel Spaß Dr. MaBuSE |
Re: Maschinensprache
Zitat:
Das weiß ich, dass ASM keine Hochsprache ist, deshalb hab ich es ja unter "" gestellt. Nur vergleichsweise zu Maschinencode kommts einem schon so vor, da assembler eben deutlich lesbarer ist. Vielleicht ist mir am Wochenende fad, dass ich sowas mal schreib. |
Re: Maschinensprache
Sehr gute Darstellung, MaBuSE!
Da bekomme ich schon fast wieder Lust :) |
Re: Maschinensprache
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Die Erstellung des kleinen Tutorials hat auch viel Spaß gemacht. Habe schon seit Jahren kein DEBUG.EXE mehr benuzt. Aber in Delphi kenn man ja auch Assebler programmieren:
Delphi-Quellcode:
Es gibt ja auch noch den CPU Debuger.
procedure TForm1.BitBtn1Click(Sender: TObject);
var x, y, z: Integer; begin x := 5; y := 7; z := 0; asm MOV EAX,X ADD EAX,Y MOV Z,EAX end; showmessage('Z='+IntToStr(z)); end; Einfach auf MOV EAX,X einen Breakpoint setzen und danach in die CPU Sicht gehen. (Menü -> Ansicht -> Debug-Fentser -> CPU) siehe Bild im Anhang Da kann man dann Delphi-Programme auf Assembler Ebene debuggen. |
Re: Maschinensprache
Also nochmal eine blöde (?) Frage: Würde es theoretisch gehen wenn man das richtige in eine Textdatei
schreibt und diese dann in .exe umbenennt, das da dann ein Programm rauskommt ? |
Re: Maschinensprache
Ja. Nur erlaubt dir nicht jeder Editor, alle notwendigen Zeichen eingeben zu können (das Nullbyte zum Beispiel).
|
Re: Maschinensprache
Nein, aber Delphi erlaubt es doch oder ?
|
Re: Maschinensprache
Nein, glaube kaum. Nimm einen Hexeditor oder debug.exe.
|
Re: Maschinensprache
Wenn ich jetzt sowas hab :
Delphi-Quellcode:
Kann ich das nicht mit Delphi so in eine Textdatei speichern das das ein richtiges Programm wird ?
E2 21 FF 21 AC 11 7D
Auch wenn das hier wahrscheinlich nichts sinnvolles ergeben würde :mrgreen: |
Re: Maschinensprache
Zitat:
Einfach neue Anwendung, TMemo, TEdit und TButton drauf und folgenden Quelltext ;-)
Delphi-Quellcode:
// Wandelt Hex Code in Bin Datei um
// Benötigt: // Memo1 mit Hexwerten /// (z.B. Memo1.Lines.Text := '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';) // Edit1 mit Dateinamen // (z.B. Edit1.Text := 'C:\TEMP\TEST.COM';) // // written by Dr. MaBuSE procedure TForm1.Button1Click(Sender: TObject); var i: Integer; s: string; BinDatei: TextFile; begin s := Memo1.Lines.Text; // unnötige Zeichen aus Text entfernen i := length(s); while i > 0 do begin if pos(upcase(s[i]), '0123456789ABCDEF') = 0 then begin delete(s, i, 1); end; dec(i); end; AssignFile(BinDatei, Edit1.Text); ReWrite(BinDatei); // String aus Hexwerten in Bin konvertieren for i := 0 to (length(s) div 2)-1 do begin Write(BinDatei, Chr(StrToInt('$'+s[i*2+1]+s[i*2+2]))); end; CloseFile(BinDatei); end; |
Re: Maschinensprache
Oder folgende Funktion verwenden:
in der Delphi 7 Hilfedatei steht Die Funktion konvertiert einen String mit Hexadezimalzeichen in den entsprechenden Binärwert.
Delphi-Quellcode:
Beschreibung
function HexToBin(Text, Buffer: PChar; BufSize: Integer): Integer
Mit HexToBin können Sie den Hexadezimal-String Text in den entsprechenden Binärwert umwandeln. Text ist die String-Darstellung eines Hexadezimalwertes. Buffer gibt den Wert in der binären Darstellung zurück. BufSize legt die Größe von Buffer fest. Text muss auf Hexadezimalzeichen mit mindestens 2*BufSize zeigen, das jedes Hexadezimalzeichen ein Byte repräsentiert. HexToBin gibt die Anzahl der Zeichen in Buffer zurück, die nicht verwendet wurden, das Text keine gültigen Hexadezimalzeichen enthalten hat ('0'..'f').. Hinweis: Die Hexadezimalzahl muss Zeichen in Kleinschreibung enthalten, da HexToBind keine Zeichen in Großschreibung erkennt. |
Re: Maschinensprache
Danke aber bei Delphi 3 gibt diese Funktion leider nicht (Wie sovieles andere auch :evil: )
Wie kann ich z.B dein Hello-World Programm damit machen ? Wenn ich in das Memo :
Delphi-Quellcode:
eingebe sieht die Exe so aus :
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
Delphi-Quellcode:
ist das richtig so ?
ëhello world$º´ Í!¸LÍ!
Wenn ich das Programm starte blinkt jedenfalls nur das DOS-Fenster kurz auf :( |
Re: Maschinensprache
Zitat:
|
Re: Maschinensprache
@tommie-lie: Er hat schon recht, wenn er das Richtige in eine Textdatei schreibt, kommt sicher ein Programm raus. Nur wird er Probleme haben, #0 zu schreiben... :wink:
Gruss Shaman |
Re: Maschinensprache
dumme Frage #3 : Was ist #0 :mrgreen:
|
Re: Maschinensprache
Ich glaube, dass das gesamte Unterfangen nichts weiter als reine Zeitverschwendung würde. Sicherlich ist es sinnvoll Grundlagen zu lernen - aber in dieser Form ist's irgendwie sehr sinnlos. Selbst wenn du wüsstest dass mit #0 das ASCII-Zeichen mit dem Index 0 gemeint ist, und damit u.a. Strings abgeschlossen werden, so ist es ganz einfach viel zu viel Handarbeit. Ich spreche da aus Erfahrung - ich habe mal versucht die FPU direkt zu steuern - also mit Opcodes. Man ist dann nur noch dabei sämtliche Speicheradressen von Hand zu berechnen, und die Parameter der Opcodes in Hex, oder in diesem Fall binär zu kodieren.
Trink dir lieber ne gute Tasse Tee, da hast du im Endeffekt mehr von :D. Der einzige Grund die CPU von Hand steuern zu wollen ist, wenn du einen kompletten Compiler von null auf selber bauen wolltest. Und selbst das wird nicht in 0/1 gemacht. Es sei gesagt dass es theoretisch möglich ist, sich aber eigentlich jeder sinvollen Machbarkeit entzieht. Gruss, Fabian |
Re: Maschinensprache
Zitat:
Trotzdem würde ich gerne wissen warum
Delphi-Quellcode:
umgewandelt in
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
Delphi-Quellcode:
nicht als exe-Datei funktioniert . Normalerweise müsste dann doch da 'hello world' stehen oder ? Bei mir blinkt aber nur kurz die DOS-Box und dann ist Ende... :gruebel:
ë hello world$º´ Í!¸LÍ!
PS: Das das eigentlich Zeitverschwendung ist ist mir klar, aber ich interessiere mich jetzt eben dafür und sinnvolle Programme hab ich noch selten geschrieben :mrgreen: |
Re: Maschinensprache
Starte das Programm mal von der Kommandozeile aus.
Gruss Shaman |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:34 Uhr. |
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