Ich liebe dich in Programmiersprache

14 Antworten

mov ah, 0x0E
mov bh, 0x00
mov al, "T"
int 0x10
Schreibe:
lodsb
cmp al, 0x00
je Schreibeende
mov ah, 0x0E
mov bh, 0x00
int 0x10
jmp Schreibe
Schreibeende:
ret
mov si, Text
call Schreibe
Text db "Ich liebe dich.",13,10,0

Assembler für x86 Prozessoren im 16 Bit Realmode. Man kann nicht "Ich liebe dich sagen" mit mehr Hardwarenähe. Es sei denn, du nimmst das Ergebnis vom Assembler und sagst es direkt in Bytecode. Wenn der Addressant ein Prozessor ist, sollte er den Opcode lesen können wenn du so tust als wärst du addressierbar. Auf die Art baucht man nicht mal ein Betriebssystem. Lerne dann den Bytecode hexadizimal und er/sie sagt immer die Speicheraddresse, du bist der Speicher und sagst das Byte. Dann kann er/sie es ausführen.

Romantisch :3


Elmo2999  13.02.2014, 03:12

Aso, die ersten 4 Zeilen sind unsinnig, sry.

Funktioniert übrigens so, dass "Text" (Label) dann noch aufgelöst wird und einen Speicheroffset bekommt, mit lodsb (0xAC) wird der Speicher immer 1 inkrementiert, cmp al fürt einen Vergleich gegen 0 in der Alu (Arithmetic Logic Unit im Prozessor) aus um zu gucken ob der String zu ende ist.

Deswegen auch ",13,10,0" das sind 3 Bytes für Zeilenumbruch und Ende. je ist jump equal, "Schreibende" ist ein Label das auch zu einer Speicheraddresse wird. Also wenn 0 dann Addressleitung auf Schreibende. Wenn nicht, dann Parameter für Output in die 16Bit Prozessorregister laden und Biosinterrupt auslösen. Das bringt die Grafikkarte dazu mit eingebauter Blockschrift das Byte als Text anzuzeigen. Dann zu "Schreibe" springen und wiederholen. So wird jeder Buchstabe einzeln ausgegeben. Bis das Nullbyte kommt.

Dannach returnt er indem er die Rücksprungaddresse vom Stack nimmt. Die letzten 2 Zeilen stellen den Funktionsaufruf dar, si Register auf die Speicheraddresse vom Text und die Subroutine callen.

Also ja, das ist ein Programm in der letzten für Menschen lesbaren Form und sagt mit jedem Befehl genau was der Prozessor machen soll. Alles andere ist bereits sehr abstakt.

Da eine Übersicht zu allem was ein Prozessor kann:

http://ref.x86asm.net/geek.html

0
Elmo2999  13.02.2014, 03:17

Nochmal korrigiert:

ausgabe:
lodsb
cmp al, 0x00
je ende
mov ah, 0x0E
mov bh, 0x00
int 0x10
jmp ausgabe
ende:
ret

mov si, ichmoechtesagen
call ausgabe
ichmoechtesagen db "Ich liebe dich.",13,10,0

Sry aber musste sein, das mit dem "T" war total unsinnig und ich finde meine Antwort so toll. Ist ein cooles T-Shirt Motive auch für totale Nerds.

0
Elmo2999  13.02.2014, 04:16
@Elmo2999

Hier noch mal mit aufgelöster Addressierung:

0000 lodsb
0001 cmp al, 0x00
0004 je 0x10
0007 mov ah, 0x0E
0009 mov bh, 0x00
000B int 0x10
000D jmp 0x00
0010 ret
0011 mov si, 0x17
0014 call 0x00
0017 db "Ich liebe dich,", 0x0D, 0x0A, 0x00

Nun weiter für den Prozessor als Opcodes:

AC        lods   al,BYTE PTR ds:[esi]
3C 00     cmp    al,0x00
74 08     je        0x0D
B4 0E     mov    ah,0x0E
B7 00     mov    bh,0x0
CD 10     int       0x10
EB F3     jmp    0
C3        ret
66 8B 35 00 00 00 00    mov    si,WORD PTR ds:0x1C
E8 E6 FF FF FF   call   0
69 63 68 20 6C 69 65 62 65 20 64 69 63 68 10 13

Und nun das fertige Programm wie es der Prozessor zu Gesicht bekommt..

In Hexadizimal:

AC 3C 00 74 08 B4 0E B7 00 CD 10 EB F3 C3 66 8B 35 00 00 00 00 E8 E6 FF FF FF 69 63 68 20 6C 69 65 62 65 20 64 69 63 68 10 13

Als normale Bytes (wie man es auf deer Festplatte speichert):

¬<t´·ÍëóÃf‹5èæÿÿÿich liebe dich

Binäre Schreibweise:

00111111 00111100 01110100 00001000 00111111 00001110 00111111 00111111 00010000 00111111 00111111 00111111 01100110 00111111 00110101 00111111 00111111 00111111 00111111 00111111 01101001 01100011 01101000 00100000 01101100 01101001 01100101 01100010 01100101 00100000 01100100 01101001 01100011 01101000 00010000 00010011

0
Elmo2999  13.02.2014, 11:19
@Elmo2999

Appropos T Shirt: http://rlv.zcache.de/kerbe_ich_hemd-r84cfb3a69b5a4d419bf9e716eb997f96_8naxt_512.jpg?max_dim=512

:3 Ist aber für Mädchen. Man kann sie nur anrufen, wenn der eigene IQ höher ist als ihrer und man in der Routine "goodLuck" eine Sicherheistlücke nutzt. Zwar einen bufferoverflow Exploit auslösen der die Rücksprungaddresse auf dem Stack (durch zu große Eingabe) überschreibt und damit auf goodJob returnt. Dann kommt man zu "callMe", sonst springt man zurück in die 2. Zeile und landet bei "noWay" und geht zu "hit".

2
procoder42  13.02.2014, 13:43
@Elmo2999

Vll sagst du noch ein paar Worte zum assemblieren , dann ist das definitiv die beste Antwort . Warum eigentlich das T ?

1
Elmo2999  13.02.2014, 23:59
@procoder42

Wüsste nun bloß nicht genau welche Worte. Beim Assemblieren wird eigentlich ja dann nix anderes gemacht als die Memorics (die ja schon das Programm 1:1 sind) in die entsprechenden Opcodes zu übersetzen und die Labels, Pointer etc in Speicheraddressen umzurechnen.

Och das T, ich musste selbst nochmal gucken wie der Interrupt war... hatte mal son low level Programmierfimmel als es um mein BS ging aber normalerweiße hat man ja nix mit BIOS Interrupten am Hut, da a) im Protectedmode die gdi (Global Interrupt Description table) benutzt wird und b) man da gar nicht ran darf da es alleinige Sache vom Betriebssystem ist. Jedenfalls hatte ich ausversehen den Beispielcode drin gelassen und das war das mit dem T.

Und danke :)

0
procoder42  14.02.2014, 06:43
@Elmo2999

Soll das ganze in gedichtsform vorgetragen werden oder ein Programm werden ? Bei letzterem wäre das assemblieren schon wichtig

0
Elmo2999  14.02.2014, 07:32
@procoder42

Aso, ich habs schnell im Texteditor gemacht mit der Tabelle (Link den ich gepostet habe).

lodsb = AC

cmp(al) = 3C

0 = 0

And so on... beachten muss man, wieviel Byte eine Zeile hat damit die Sprünge stimmen. Wenn man das Ganze von einem Assembler übersetzen lassen möchte, dann ohne executable Format linken. Pures *.bin, das wäre unter Windows oder Linux oder ... sowieso net ausführbar wegen "illegal instructions" ( wenn man in ollydbg in ein Programm "int" oder "in/out" patcht, wird es dannach vom Windows nicht mehr genommen). Man kann es sich aber in den Bootstrap hauen und als Bootloader booten. Lauffähig ab einem 8086.

0

Na Klar ist das möglich :D. Kommt drauf an in welcher Programmiersprache und ob du es einfach nur in einer Konsole einzeigen willst oder in einen Programm mit Benutzeroberfläche(UI). Du kannst es aber auch in Binär Code schreiben:

"Ich liebe dich" in Binär Code = "01001001 01100011 01101000 00100000 01101100 01101001 01100101 01100010 01100101 00100000 01100100 01101001 01100011 01101000"


Elmo2999  13.02.2014, 04:19

Nein, so:

¬<t´·ÍëóÃf‹5èæÿÿÿich liebe dich

:(

0
usernew283  14.02.2014, 19:10
@Elmo2999

Er redet vom Binär-Code... Also ist seine Aussage schon richtig.

1
Elmo2999  14.02.2014, 21:51
@usernew283

Wenn man mir sagen könnte was ein Binärcode ist? Für mich sind Obige nur binäre Zahlen die halt 14 Bytes darrstellen und dabei pro Bit ein ganzes Byte verschleudern. Das ist kein Code, sondern nur eine sehr verschwenderische Weiße "Ich liebe dich" zu schreiben. Man braucht halt 8 mal soviel Speicher. Ob man es nun hexadezimal, oktal, binär, dezimal oder einfach als Buchstaben darrstellt, ist doch wurst. Außer, dass der reale Computer mit obigen "binär Code" gar nicht mehr zurecht käme. Vielleicht nehm ich das zu ernst :D

0

http://home.paulschou.net/tools/xlate/ einfach de text eingeben und loß gehts :) Es ist zwar nicht direkt "Programierersprache" aber zumindest im Binärcode, etc.)


hey00770000  12.02.2014, 17:56

Binärcode: 01001001 01100011 01101000 00100000 01101100 01101001 01100101 01100010 01100101 00100000 01100100 01101001 01100011 01101000

Hex: 49 63 68 20 6c 69 65 62 65 20 64 69 63 68

Base 64: SWNoIGxpZWJlIGRpY2g=

AscII: 73 99 104 32 108 105 101 98 101 32 100 105 99 104

Check sum: MD2: MD4: 7d3d159b8d65703a12d8803f7336d744 MD5: d4b602854dc8d4ff6bf10785f5834033 CRC 8, ccitt, 16, 32 :

CRYPT (form: $ MD5? $ SALT $ CRYPT): $1$eXSLnSye$0ksX91STzdWAAVz2vWBBf. (form: SALT[2] CRYPT[11]): ps.BsCK1pXUDI

SHA1: 27344c69e1e39263a780053798db9caade1efd55 RIPEMD-160: 3e2ca2829f099bf7378d13196bbf7f51ddc0e259

0

... in "Programmiersprache" wäre so ziemlich das gleiche, wie es normal zu schreiben, z. B. printf("%s", "Text");

Du könntest den Text in Hexadezimal oder gar Binär schreiben. Siehe dir dazu eine ASCII-Tabelle an.

nein, eine programmiersprache ist keine sprache im wortwörtlichen sinne, sondern nur eine zusammenstellung von befehlen und strukturen, um maschinenlesebare codes zu generieren.

versuche es doch mal mit chinesisch:

我愛你毛茛