Entwickler-Ecke
Sonstiges (Delphi) - Eigenen Compilierer schreiben
K.S.M. - So 03.08.08 13:53
Titel: Eigenen Compilierer schreiben
Hi!
Ich hab schon bei Google gesucht, aber nichts brauchbares gefunden... Aber weiß jemand wie man zu seiner (eigenen) Programmiersprache einen Compiler schreibt, der eine EXE erstellen kann?
Mir würde erst natürlich was "einfaches" reichen (Konsolenanwendung).
Vielen Dank im Voraus! :D
Gausi - So 03.08.08 14:01
Für welches Betriebssystem denn? Win32 oder ein eigenes? ;-)
mkinzler - So 03.08.08 14:03
Such mal nach Compilerbau dann solltest du einiges finden.
Apollo - So 03.08.08 14:06
Das müsste möglich sein, aber das wird ne ganze menge Zeit in anspruch nehmen. Wiso willst du eine eigene programmiersprache entwickeln? Wenn dir Delphi nicht reicht steig einfach auf andere ganauso effektive programmiersprachen um z.B. java oder C#. Besonderst letzderes ist weit verbreitet. Jetzt zu deiner Frage:
Möchtest du deine eigene Programmiersprache erstellen wäre es wohl das einfachste sie in Delphi zu übersetzen. Du hast z.B. ein Memo auf dem Formular und tippst deinen Befehl für Text ein und die Position. Dann könntest du auf dem Programmformular einfach ein Label hinzufügen mit deinem Text und mit Top und Left kannst du es ausrichten. Wie man eine exe erstellt weiß ich leider nicht.
Ich hoffe ich konnte dir helfen.
[Edit]War mal wieder der Letzte :motz:
Timosch - So 03.08.08 14:14
Dir ist klar, was das für ein Aufwand ist? Du musst die Befehle parsen, i.d.R. in Assembler übersetzen und das ganze wiederum in die eigentlichen, numerischen Anweisungen übersetzen. Also bevor wir das hier vertiefen: Wie lange programmierst du in Delphi, und wie gut kannst du Assembler?
Ansonsten: Die Frage "Wie" verstehe ich in dem Zusammenhang nicht ganz. Ist doch klar: Du musst deine Befehle in die Mnemonics der CPU übersetzen.
K.S.M. - Mo 04.08.08 10:52
Danke für die Antowrten :D !
Zitat: |
Für welches Betriebssystem denn? Win32 oder ein eigenes? |
Für Win32 ;)
Zitat: |
Möchtest du deine eigene Programmiersprache erstellen wäre es wohl das einfachste sie in Delphi zu übersetzen. Du hast z.B. ein Memo auf dem Formular und tippst deinen Befehl für Text ein und die Position. Dann könntest du auf dem Programmformular einfach ein Label hinzufügen mit deinem Text und mit Top und Left kannst du es ausrichten. |
So habe ich mir das schon vorgestellt. Das ist ja auch nicht so schwierig.
Zitat: |
Dir ist klar, was das für ein Aufwand ist? Du musst die Befehle parsen, i.d.R. in Assembler übersetzen und das ganze wiederum in die eigentlichen, numerischen Anweisungen übersetzen. Also bevor wir das hier vertiefen: Wie lange programmierst du in Delphi, und wie gut kannst du Assembler? |
Mir ist klar, dass das ein Aufwand ist. Also mit Delphi programmiere ich jetzt schon einige Jahre, und mit Assemblern habe ich eig auch schon gearbeitet.
Zitat: |
Die Frage "Wie" verstehe ich in dem Zusammenhang nicht ganz |
Also, es gibt so gewisse reinfolgen wie "Sprache überlegen, Parser schreiben, ..." diese ersten kann ich in Delphi machen (das krieg ich auch hin). Aber wie schreibe ich einen
compilierten Binärcode für die *.exe?
Danke für die raschen Antworten! :wave:
Allesquarks - Mo 04.08.08 10:59
Nun ja entweder du holst dir Speicher (Delphi kann das glaube ich nicht untypisiert, obwohl in der System oder so manche Buffer keinen Typ haben, aber ich glaube das ist eine Ausnahme, die die Jungs von Borland sich da rausgenommen haben) und schreibst in den dann binär. Oder du machst einen Filestream (die exe soll später ja eh ne datai sein oder?) und schreibst da die binären Opcodes rein (das hat auch den Vorteil, dass dieser Buffer keinen Typ hat und da Delphi nicht meckert, aber das sollte wohl eines deiner kleineren Probleme sein).
K.S.M. - Mo 04.08.08 11:06
Wahrscheinlich hast du mein Problem fehlverstanden, ich meinte wie ich den Binärcode erstelle (die Datei würd ich noch schaffen denke ich ;) ). Da fehlt mir die Lücke. Wie übersetze ich die Prozeduren in Binärcode und schreibe ihn dann in einen FileStream?
Tut mir Leid, wenn meine Fragen so uneindeutig sind :D !
:wink:
Gausi - Mo 04.08.08 11:14
@Allesquarks: nichts für ungut, aber deine Antwort war glaube ich ungefähr so hilfreich wie "Da nimmst du einfach etwas Metall und bringst das in Form." Auf die Frage "Wie kann ich einen Motor für mein selbst entwickeltes Auto bauen?". :lol:
Wie vorher schon gesagt: Das ist ein recht komplexes Thema. Du brauchst erstmal Kenntnisse im Compilerbau, und dann tiefgehendes Wissen über Windows. Daher ja auch meine Frage, ob du Windows oder lieber ein eigenes OS benutzen willst. ;-)
Das einzige, was ich halbwegs für machbar hielte, wäre eine Interpretersprache mit einem Zusatzprogramm, was aus einem Code eine Exe baut, indem es den (mit Delphi?) compilierten Interpreter um eine Ressource ergänzt, in der der zu interpretierende Code steht. Das könnte man dann als Exe verteilen - die Exe lädt dann beim Start den Code aus der Ressource und arbeitet den ab.
Timosch - Mo 04.08.08 11:19
K.S.M. hat folgendes geschrieben: |
Wahrscheinlich hast du mein Problem fehlverstanden, ich meinte wie ich den Binärcode erstelle (die Datei würd ich noch schaffen denke ich ;) ). Da fehlt mir die Lücke. Wie übersetze ich die Prozeduren in Binärcode und schreibe ihn dann in einen FileStream?
Tut mir Leid, wenn meine Fragen so uneindeutig sind :D !
:wink: |
Du musst wissen, welcher Assembler-Mnemonic für welche numerische Anweisung steht. Bei MASM32 liegt da eine Hilfedatei bei:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445: 446: 447: 448: 449: 450: 451: 452: 453: 454: 455: 456: 457: 458: 459: 460: 461: 462: 463: 464: 465: 466: 467: 468: 469: 470: 471: 472: 473: 474: 475: 476: 477: 478: 479: 480: 481: 482: 483: 484: 485: 486: 487: 488: 489: 490: 491: 492: 493: 494: 495: 496: 497: 498: 499: 500: 501: 502: 503: 504: 505: 506: 507: 508: 509: 510: 511: 512: 513: 514: 515: 516: 517: 518: 519: 520: 521: 522: 523: 524: 525: 526: 527: 528: 529: 530: 531: 532: 533: 534: 535: 536: 537: 538: 539: 540: 541: 542: 543: 544: 545: 546: 547: 548: 549: 550: 551: 552: 553: 554: 555: 556: 557: 558: 559: 560: 561: 562: 563: 564: 565: 566: 567: 568: 569: 570: 571: 572: 573: 574: 575: 576: 577: 578: 579: 580: 581: 582: 583: 584: 585: 586: 587: 588: 589: 590: 591: 592: 593: 594: 595: 596: 597: 598: 599: 600: 601: 602: 603: 604: 605: 606: 607: 608: 609: 610: 611: 612: 613: 614: 615: 616: 617: 618: 619: 620: 621: 622: 623: 624: 625: 626: 627: 628: 629: 630: 631: 632: 633: 634: 635: 636: 637: 638: 639: 640: 641: 642: 643: 644: 645: 646: 647: 648: 649: 650: 651: 652: 653: 654: 655: 656: 657: 658: 659: 660: 661: 662: 663: 664: 665: 666: 667: 668: 669: 670: 671: 672: 673: 674: 675: 676: 677: 678: 679: 680: 681: 682: 683: 684: 685: 686: 687: 688: 689: 690: 691: 692: 693: 694: 695: 696: 697: 698: 699: 700: 701: 702: 703: 704: 705: 706: 707: 708: 709: 710: 711: 712: 713: 714: 715:
| 00 ADD 01 ADD
02 ADD 03 ADD 04 ADD 05 ADD 06 PUSH 07 POP 08 OR 09 OR 0A OR 0B OR 0C OR 0D OR 0E PUSH 0F 00 LLDT 0F 00 LTR 0F 00 SLDT 0F 00 STR 0F 00 VERR 0F 00 VERW 0F 01 INVLPG 0F 01 LGDT 0F 01 LIDT 0F 01 LMSW
0F 01 SGDT 0F 01 SIDT 0F 01 SMSW 0F 01 SMSW 0F 02 LAR 0F 03 LSL 0F 08 INVD 0F 09 WBINVD 0F 0B UD2 0F 20 MOV 0F 21 MOV 0F 22 MOV 0F 23 MOV 0F 30 WRMSR 0F 31 RDTSC 0F 32 RDMSR 0F 33 RDPMC 0F 40 CMOVO 0F 41 CMOVNO 0F 42 CMOVB
0F 42 CMOVC 0F 42 CMOVNAE 0F 43 CMOVAE 0F 43 CMOVNB 0F 43 CMOVNC 0F 44 CMOVE 0F 44 CMOVZ 0F 45 CMOVNE 0F 45 CMOVNZ 0F 46 CMOVBE 0F 46 CMOVNA 0F 47 CMOVA 0F 47 CMOVNBE 0F 48 CMOVS 0F 49 CMOVNS 0F 4A CMOVP 0F 4A CMOVPE 0F 4B CMOVNP 0F 4B CMOVPO
0F 4C CMOVL 0F 4C CMOVNGE 0F 4D CMOVGE 0F 4D CMOVNL 0F 4E CMOVLE 0F 4E CMOVNG 0F 4F CMOVG 0F 4F CMOVNLE 0F 60 PUNPCKLBW 0F 61 PUNPCKLWD 0F 62 PUNPCKLDQ 0F 63 PACKSSWB 0F 64 PCMPGTB 0F 65 PCMPGTW 0F 66 PCMPGTD 0F 67 PACKUSWB 0F 68 PUNPCKHBW 0F 69 PUNPCKHWD
0F 6A PUNPCKHDQ 0F 6B PACKSSDW 0F 6E MOVD 0F 6F MOVQ 0F 71 PSLLW 0F 71 PSRAW 0F 71 PSRLW 0F 72 PSLLD 0F 72 PSRAD 0F 72 PSRLD 0F 73 PSLLQ 0F 73 PSRLQ 0F 74 PCMPEQB 0F 75 PCMPEQW 0F 76 PCMPEQD 0F 77 EMMS 0F 7E MOVD 0F 7F MOVQ 0F 80 JO
0F 81 JNO 0F 82 JB 0F 82 JC 0F 82 JNAE 0F 83 JAE 0F 83 JNB 0F 83 JNC 0F 84 JE 0F 84 JZ 0F 85 JNE 0F 85 JNZ 0F 86 JBE 0F 86 JNA 0F 87 JA 0F 87 JNBE 0F 88 JS 0F 89 JNS 0F 8A JP 0F 8A JPE 0F 8B JNP 0F 8B JPO
0F 8C JL 0F 8C JNGE 0F 8D JGE 0F 8D JNL 0F 8E JLE 0F 8E JNG 0F 8F JG 0F 8F JNLE 0F 90 SETO 0F 91 SETNO 0F 92 SETB 0F 92 SETC 0F 92 SETNAE 0F 93 SETAE 0F 93 SETNB 0F 93 SETNC 0F 94 SETE 0F 94 SETZ 0F 95 SETNE 0F 95 SETNZ
0F 96 SETBE 0F 96 SETNA 0F 97 SETA 0F 97 SETNBE 0F 98 SETS 0F 99 SETNS 0F 9A SETP 0F 9A SETPE 0F 9B SETNP 0F 9B SETPO 0F 9C SETL 0F 9C SETNGE 0F 9D SETGE 0F 9D SETNL 0F 9E SETLE 0F 9E SETNG 0F 9F SETG 0F 9F SETNLE 0F A0 PUSH 0F A1 POP
0F A3 BT 0F A4 SHLD 0F A5 SHLD 0F A8 PUSH 0F A9 POP 0F AA RSM 0F AB BTS 0F AC SHRD 0F AD SHRD 0F AF IMUL 0F B0 CMPXCHG 0F B1 CMPXCHG 0F B2 LSS 0F B3 BTR 0F B4 LFS 0F B5 LGS 0F B6 MOVZX 0F B7 MOVZX 0F BA BT 0F BA BTC 0F BA BTR
0F BA BTS 0F BB BTC 0F BC BSF 0F BD BSR 0F BE MOVSX 0F BF MOVSX 0F C0 XADD 0F C1 XADD 0F C7 CMPXCHG8B 0F C8 BSWAP 0F D1 PSRLW 0F D2 PSRLD 0F D3 PSRLQ 0F D8 PSUBUSB 0F D9 PSUBUSW 0F DB PAND 0F DC PADDUSB 0F DD PADDUSW 0F DF PANDN 0F E1 PSRAW
0F E2 PSRAD 0F E5 PMULHW 0F E8 PSUBSB 0F E9 PSUBSW 0F EB POR 0F EC PADDSB 0F ED PADDSW 0F EF PXOR 0F F1 PSLLW 0F F2 PSLLD 0F F3 PSLLQ 0F F5 PMADDWD 0F F8 PSUBB 0F F9 PSUBW 0F FA PSUBD 0F FC PADDB 0F FD PADDW 0F FE PADDD 10 ADC
11 ADC 12 ADC 13 ADC 14 ADC 15 ADC 16 PUSH 17 POP 18 SBB 19 SBB 1A SBB 1B SBB 1C SBB 1D SBB 1E PUSH 1F POP 20 AND 21 AND 22 AND 23 AND 24 AND 25 AND 27 DAA 28 SUB 29 SUB
2A SUB 2B SUB 2C SUB 2D SUB 2F DAS 30 XOR 31 XOR 32 XOR 33 XOR 34 XOR 35 XOR 37 AAA 38 CMP 39 CMP 3A CMP 3B CMP 3C CMP 3D CMP 3F AAS 40 INC 48 DEC 50 PUSH 58 POP 60 PUSHA
60 PUSHAD 61 POPA 61 POPAD 62 BOUND 63 ARPL 68 PUSH 69 IMUL 6A PUSH 6B IMUL 6C INS 6C INSB 6D INS 6D INSD 6D INSW 6E OUTS 6E OUTSB 6F OUTS 6F OUTSD 6F OUTSW 70 JO 71 JNO 72 JB 72 JC
72 JNAE 73 JAE 73 JNB 73 JNC 74 JE 74 JZ 75 JNE 75 JNZ 76 JBE 76 JNA 77 JA 77 JNBE 78 JS 79 JNS 7A JP 7A JPE 7B JNP 7B JPO 7C JL 7C JNGE 7D JGE 7D JNL 7E JLE 7E JNG
7F JG 7F JNLE 80 ADC 80 ADD 80 AND 80 CMP 80 OR 80 SBB 80 SUB 80 XOR 81 ADC 81 ADD 81 AND 81 CMP 81 OR 81 SBB 81 SUB 81 XOR 83 ADC 83 ADD 83 AND 83 CMP 83 OR 83 SBB
83 SUB 83 XOR 84 TEST 85 TEST 86 XCHG 87 XCHG 88 MOV 89 MOV 8A MOV 8B MOV 8B MOV 8C MOV 8D LEA 8E MOV 8F POP 90 NOP 90 XCHG 98 CBW 98 CWDE 99 CDQ 99 CWD 9A CALL 9A CALL 9B D9 FSTCW
9B D9 FSTENV 9B DB E2 FCLEX 9B DB E3 FINIT 9B DD FSAVE 9B DD FSTSW 9B DF E0 FSTSW 9B FWAIT 9B WAIT 9C PUSHF 9C PUSHFD 9D POPF 9D POPFD 9E SAHF 9F LAHF A0 MOV A1 MOV A2 MOV A3 MOV A4 MOVS A4 MOVSB A5 MOVS
A5 MOVSD A5 MOVSW A6 CMPS A6 CMPSB A7 CMPS A7 CMPSD A7 CMPSW A8 TEST A9 TEST AA STOS AA STOSB AB STOS AB STOSD AB STOSW AC LODS AC LODSB AD LODS AD LODSD AD LODSW AE SCAS AE SCASB AF SCAS AF SCASD
AF SCASW B0 MOV B8 MOV C0 RCL C0 RCR C0 ROL C0 ROR C0 SAL C0 SAR C0 SHL C0 SHR C1 RCL C1 RCR C1 ROL C1 ROR C1 SAL C1 SAR C1 SHL C1 SHR C2 RET C3 RET C4 LES C5 LDS C6 MOV
C7 MOV C8 00 ENTER C8 01 ENTER C8 ENTER C9 LEAVE CA RET CC INT CD INT CE INTO CF IRET CF IRETD D0 RCL D0 RCR D0 ROL D0 ROR D0 SAL D0 SAR D0 SHL D0 SHR D1 RCL D1 RCR D1 ROL D1 ROR
D1 SAL D1 SAR D1 SHL D1 SHR D2 RCL D2 RCR D2 ROL D2 ROR D2 SAL D2 SAR D2 SHL D2 SHR D3 RCL D3 RCR D3 ROL D3 ROR D3 SAL D3 SAR D3 SHL D3 SHR D4 (No mnemonic) D4 0A AAM D5 (No mnemonic)
D5 0A AAD D7 XLAT D7 XLATB D8 C0 FADD D8 C8 FMUL D8 D0 FCOM D8 D1 FCOM D8 D8 FCOMP D8 D9 FCOMP D8 E0 FSUB D8 E8 FSUBR D8 F0 FDIV D8 F8 FDIVR D8 FADD D8 FCOM D8 FCOMP D8 FDIV D8 FDIVR D8 FMUL D8 FSUB D8 FSUBR
D9 C0 FLD D9 C8 FXCH D9 C9 FXCH D9 D0 FNOP D9 E0 FCHS D9 E1 FABS D9 E4 FTST D9 E8 FLD1 D9 E9 FLDL2T D9 EA FLDL2E D9 EB FLDPI D9 EC FLDLG2 D9 ED FLDLN2 D9 EE FLDZ D9 F0 F2XM1 D9 F2 FPTAN D9 F3 FPATAN D9 F4 FXTRACT D9 F5 FPREM1 D9 F6 FDECSTP
D9 F7 FINCSTP D9 F9 FYL2XP1 D9 FA FSQRT D9 FB FSINCOS D9 FC FRNDINT D9 FD FSCALE D9 FE FSIN D9 FF FCOS D9 FLD D9 FLDCW D9 FLDENV D9 FNSTCW D9 FNSTENV D9 FST D9 FSTP DA C0 FCMOVB DA C8 FCMOVE DA D0 FCMOVBE DA D8 FCMOVU DA E9 FUCOMPP
DA FIADD DA FICOM DA FICOMP DA FIDIV DA FIDIVR DA FIMUL DA FISUB DA FISUBR DB C0 FCMOVNB DB C8 FCMOVNE DB D0 FCMOVNBE DB D8 FCMOVNU DB E2 FNCLEX DB E3 FNINIT DB E8 FUCOMI DB F0 FCOMI DB FILD DB FIST DB FISTP DB FLD DB FSTP
DC C0 FADD DC C8 FMUL DC E0 FSUBR DC E8 FSUB DC F0 FDIVR DC F8 FDIV DC FADD DC FCOM DC FCOMP DC FDIV DC FDIVR DC FMUL DC FSUB DC FSUBR DD C0 FFREE DD D0 FST DD D8 FSTP DD E0 FUCOM DD E1 FUCOM DD E8 FUCOMP DD E9 FUCOMP
DD FLD DD FNSAVE DD FNSTSW DD FRSTOR DD FST DD FSTP DE C0 FADDP DE C1 FADDP DE C8 FMULP DE C9 FMULP DE D9 FCOMPP DE E0 FSUBRP DE E1 FSUBRP DE E8 FSUBP DE E9 FSUBP DE F0 FDIVRP DE F1 FDIVRP DE F8 FDIVP DE F9 FDIVP DE FIADD
DE FICOM DE FICOMP DE FIDIV DE FIDIVR DE FIMUL DE FISUB DE FISUBR DF E0 FNSTSW DF E8 FUCOMIP DF F0 FCOMIP DF FBLD DF FBSTP DF FILD DF FIST DF FISTP E0 LOOPNE E0 LOOPNZ E1 LOOPE E1 LOOPZ E2 LOOP E3 JCXZ E3 JECXZ
E4 IN E5 IN E6 OUT E7 OUT E8 CALL E9 JMP EA JMP EB JMP EC IN ED IN EE OUT EF OUT F0 LOCK F2 A6 REPNE F2 A7 REPNE F2 AE REPNE F2 AF REPNE F3 6C REP F3 6D REP F3 6E REP F3 6F REP F3 A4 REP F3 A5 REP
F3 A6 REPE F3 A7 REPE F3 AA REP F3 AB REP F3 AC REP F3 AD REP F3 AE REPE F3 AF REPE F4 HLT F5 CMC F6 DIV F6 IDIV F6 IMUL F6 MUL F6 NEG F6 NOT F6 TEST F7 DIV F7 IDIV F7 IMUL F7 MUL F7 NEG F7 NOT
F7 TEST F8 CLC F9 STC FA CLI FC CLD FD STD FE DEC FE INC FF CALL FF DEC FF INC FF JMP FF PUSH |
K.S.M. - Mo 04.08.08 11:23
Gausi hat folgendes geschrieben: |
Das einzige, was ich halbwegs für machbar hielte, wäre eine Interpretersprache mit einem Zusatzprogramm, was aus einem Code eine Exe baut, indem es den (mit Delphi?) compilierten Interpreter um eine Ressource ergänzt, in der der zu interpretierende Code steht. Das könnte man dann als Exe verteilen - die Exe lädt dann beim Start den Code aus der Ressource und arbeitet den ab. |
(Ich fasse das mal für mich zusammen)
Also ich nehme eine in Delphi geschriebene "Inerpretier-Exe", die eine Ressource mit meinem Code zugewiesen bekommt. Das wäre natürlich simpel. Wie kann ich denn einer bereits vorhandenen EXE eine Ressource zuweisen?
---
Moderiert von
Narses: Beiträge zusammengefasst---
@Timosch: Das ist ja sehr interessant! Wie mache ich daraus denn den Binärcode?
Timosch - Mo 04.08.08 11:43
K.S.M. hat folgendes geschrieben: |
@Timosch: Das ist ja sehr interessant! Wie mache ich daraus denn den Binärcode? |
Ähm, die hexadezimalen Zahlen
sind Maschinensprache...
K.S.M. - Mo 04.08.08 11:45
Timosch hat folgendes geschrieben: |
Ähm, die hexadezimalen Zahlen sind Maschinensprache... |
Oh :D
na ja, ich mein wenn man mal auf die lustige Idee gekommen ist (so wie ich ;)) eine EXE mit dem Editor zu öffnen, sehe ich doch viele lustige Zeichen. Wie schreibe ich den so einen Code?
Timosch - Mo 04.08.08 11:47
K.S.M. hat folgendes geschrieben: |
Timosch hat folgendes geschrieben: |
Ähm, die hexadezimalen Zahlen sind Maschinensprache... |
Oh :D
na ja, ich mein wenn man mal auf die lustige Idee gekommen ist (so wie ich ;)) eine EXE mit dem Editor zu öffnen, sehe ich doch viele lustige Zeichen. Wie schreibe ich den so einen Code? |
Dieser Frage nach solltest du dich vielleicht mit etwas einfacherem als einem Compiler beschäftigen...
Ein Editor stellt ASCII-/ANSI-/Unicode-Zeichen dar. Öffne eine EXE mal mit einem Hex-Editor und du siehst genau solche Opcodes.
smt - Mo 04.08.08 11:52
@KSM:
Schreib doch am erstmal eine Assembler-Datei (am besten als .COM-Datei - das ist erstmal am einfachsten, bevor Du Dich mit EXE-Dateien rumschlägst), die nur mal einen Text auf dem Bildschirm ausgibt (Kommandozeile). Dann nimm diesen Code und schreib mit Delphi ein Programm, welches diesen Codes als eine Art Bibliothek in einer .COM Datei ablegt. Dann baust Du einen Parser und wenn dann zum Beispiel das Kommando "write 'abc';" kommt, rufst Du diesen Code als Funktion aus Deiner Bibliothek auf.
Voila: Du hast einen Compiler geschrieben ! Nun müssen natürlich noch die weiteren Funktionen (Eingaben, Schleifen, Variablen, etc.) hinzugefügt werden. Und wenn Du das alles hast, kannst Du hingehen und aus Deiner Bibilothek noch das wegoptimieren, was Du nicht benötigt hast... Willst ja kein zweites Free-Pascal schreiben ;)
Aber nichts für ungut: Einen Interpreter zu schreiben ist bedeutend einfacher und funktioniert mindestens genauso gut. Du musst halt in diesem Falle die "Sourcefiles" immer mitliefern. Aber diese kann man ja z.b. vorher verschlüsseln oder in eine Art Code zu übersetzen, falls der Source geschützt werden soll.
VG Sascha
Timosch - Mo 04.08.08 11:55
smt hat folgendes geschrieben: |
Aber nichts für ungut: Einen Interpreter zu schreiben ist bedeutend einfacher und funktioniert mindestens genauso gut. Du musst halt in diesem Falle die "Sourcefiles" immer mitliefern. Aber diese kann man ja z.b. vorher verschlüsseln oder in eine Art Code zu übersetzen, falls der Source geschützt werden soll.
VG Sascha |
...also Bytecode erzeugen. Sowas wäre in der Tat wesentlich einfacher, da muss ich smt Recht geben. Probiers erstmal besser mit sowas.
Allesquarks - Mo 04.08.08 12:45
@@Gausi: Er meinte er hat assembler Erfahrung da dachte ich schon das mein Kommentar hilfreich ist. Ich bin eben auch davon ausgegangen, dass er wenigstens weiß, dass ein mnemonic (wie schreibt sich das Viech) direkt ein binärer Opcode ist. Ich wollte ihm eigentlich nur sagen, dass er die aneinander reihen muss.
Vlt hilft ja diese Antwort mehr (ich halte übrigens einen Interpreter für nicht viel leichter): Guck dir mal an, was du bei einer Sprache machst oder erst recht in assembler. Du berechnest adressen schreibst sachen in Speicher und rechnest werte aus (gut und Sprungberechnung aber für den Anfang kannst du deine Funktions ja erstmal mit Zwischenraum designen). Einem := in Delphi müsste also dein Compiler in eine Adressberechnung der Variablen auflösen und dann das was rechts evt. berechnet wurde, von einer zweiten ggf. zu errechnenden Adresse holen. Manchmal gibts dann auch noch pointer auf pointer etc. Aber das wärs eigentlich schon :wink: Ich weiß jetzt kommt wieder der Motor. Mir ist klar, dass man das beliebig verkomplizieren kann. Kommt ja auch darauf an, was du alles benutzen möchtest. Willst du den Stack benutzen, oder sogar ne Registerheuristik implementieren? Ich denke aber ein sehr langsamer basaler Compiler liegt durchaus im Bereich des Möglichen. Schreib doch erstmal schnell nen Disassembler das hilft dir dann ovn den Grundlagen ungemein.
K.S.M. - Mo 04.08.08 22:10
Danke für die Antworten!
Ich werde das mit der COM-Datei ausprobieren. Kann vlt jemand einen Beispielcode schicken?
Delete - Mo 04.08.08 22:25
mhh, würde dir ebenfalls raten dir deinen eigenen interpreter zu schreiben, wie M$ mit .Net oder für den fang den code als ASM zu verpacken und anschliessend durch den assembler zu schicken (z. b. wie C) :-)
wenn du es dann in ASM hast, brauchste es nur noch 1:1 übersetzen in maschinensprache, das ist aber dann vom jeweiligen prozessor abhängig... aber das kennste ja bestimmt ... :-)
K.S.M. - Mo 04.08.08 22:31
Ok, aber wie schreibt man denn eine COM-Datei? Offensichtlich ja direkt mit Assemblern, zumindest habe ich es so bei Wikipedia (
http://de.wikipedia.org/wiki/COM-Datei) verstanden. Ich kenn mich nur mit ASM nicht SO gut aus, das ich eine Konsole öffnen, Text anzeigen und die Konsole wieder schließen kann. (für ein Testprojekt.) Weiß vielleicht jemand, wie man das macht?
// EDIT: falscher Wiki-Link ;)
Delete - Mo 04.08.08 22:34
tja, dann haste ein problem, wenn du dich nicht mit assembler auskennst...
ASM sind nur die memonics für die speicherabbildung. in diesem fall rat ich dir, dich mal intensiv mit ASM auseinanderzusetzen. das sind die grundlagen, wenn du in diesem bereich was machen willst...
PS: wenn du ASM drauf hast, solltest dir 'n paar gute bücher über compilerbau reinziehen...
PPS: die paar bytes kannste schreiben wie du willst .. in aller regel schreibt man mit dem compiler selbst dem compiler .. z.b. so in C, oder auch in Delphi ;-)
delfiphan - Mo 04.08.08 22:38
Was soll dein Compiler denn alles können? Willst du nicht etwas Fertiges nehmen?
Compilerbau ist eines der komplizierteren Themen der Informatik. Genug kompliziert und aufwändig, dass man Compiler normalerweise nicht von Hand schreibt. Es gibt sog. Compiler-Compiler um den Source (oder zu mindest ein Gerüst) eines Compilers zu erzeugen.
Vielleicht probierst du's mal mit einem einfachen Interpreter für eine einfache Skriptsprache. Wenn du unbedingt eine Exe brauchst kannst du ja den Interpreter nehmen und dort das Skript als Ressource einbinden.
K.S.M. - Mo 04.08.08 23:00
Ja, ich weiß das es kompliziert werden würde. Aber ich wollte mich ja auch mit dem Thema intensiv auseinander setzen.
Ich wollte jetzt erst einmal wissen, wie man eine COM-Datei schreibt, also wie sie aufgebaut ist, wie man die Assembler-befehle hineinschreibt usw.
Dunkel - Mo 04.08.08 23:22
K.S.M. hat folgendes geschrieben: |
Ja, ich weiß das es kompliziert werden würde. Aber ich wollte mich ja auch mit dem Thema intensiv auseinander setzen.
Ich wollte jetzt erst einmal wissen, wie man eine COM-Datei schreibt, also wie sie aufgebaut ist, wie man die Assembler-befehle hineinschreibt usw. |
Nichts für Ungut, aber Du verrennst Dich gerade ein wenig. Offensichtlich hast Du nicht genügend Vorkenntnisse um in die Materie Compilerbau einzusteigen (mach Dir nichts draus, geht geschätzten 98% der in diesem Forum anwesenden Usern so).
Wie schon einige User geschrieben haben, solltest Du Dich vielleicht zuerst mal mit einem Interpreter beschäftigen (dass dabei auch was "gutes" rauskommen kann, sieht man an Wilhelm Zäune [Bill Gates halt]). Da lernst Du zumindest schon mal die grundlegendsten Grundlagen (Parser, etc.). Dann kannst Du Dich langsam in Assembler einlesen, die CPU-Spezifikationen von Intel und AMD büffeln. Vielleicht hast Du dann, nach 5 Jahren oder länger, genügend Informationen gesammelt um einen eigenen, kleinen Compiler zu basteln.
Warum möchtest Du Dir eigentlich eine eigene Programmiersprache schreiben? Die Idee ist ja schon fast verrückter, als sich ein eigenes Betriebssystem zu basteln... ist beides irgendwie ohne praktischen Nutzen. :roll:
Timosch - Di 05.08.08 11:54
K.S.M. hat folgendes geschrieben: |
Ja, ich weiß das es kompliziert werden würde. Aber ich wollte mich ja auch mit dem Thema intensiv auseinander setzen.
Ich wollte jetzt erst einmal wissen, wie man eine COM-Datei schreibt, also wie sie aufgebaut ist, wie man die Assembler-befehle hineinschreibt usw. |
Ich habe gestern die Opcodes gepostet. Du übersetzt deine Programmiersprache in Assembler, ersetzt dann die Mnemonics durch die genannten Opcodes, machst aus Labels Speicheraddressen, aus Registern die entsprechenden Hex-Codes etc. und schreibst das ganze ganz normal in eine Datei. Dann hast du eine COM-Datei.
Wie sie aufgebaut ist, hättest du mit einem simplen Blick in die Wikipedia herausfinden können: Sie besteht schlicht und ergreifend nur aus einem Codesegment.
Am besten du gehst folgendermaßen vor: Beschäftige dich intensiv mit Assembler, dann kauf dir das Buch "Grundlagen und Techniken des Compilerbaus" von Niklaus Wirth, Addison-Wesley ISBN 3-89-319-931-4 (39,90 im Buchhandel, zumindest vor ein paar Jahren, als ich es mir gekauft habe) und lies es dir durch. Aus meiner persönlichen Erfahrung ist das eines der besten Bücher zu dem Thema (und einen kompetenteren Autoren wird man wohl kaum finden).
Sinspin - Di 05.08.08 15:13
Wenn du alle Einzelteile, die du brauchst um von einem stückchen Quelltext zu einem Programm zu kommen, selber schreiben willst kannst du deine Idee, aus meiner Sicht, jetzt schon an den Nagel hängen.
Ich an deiner Stelle würde mir erstmal einen kleinen Interpreter mit sehr begrenztem Funktionsumfang schreiben. Und ein kleines Programm das in der Lage ist, eine von dir entwickelte Sprache in Code umzusetzen die dein Interpreter verstehen und ausführen kann.
Schon das ist für den Anfang eine ganz ordentliche Herausvorderung.
Wenn du das hast, kannst du deine Sprache verbessern, den compiler anpassen und den Umfang deines Interpreters erweitern.
Da werden sicher ein paar ordentlich harte Nüsse dabei sein die gelößt werden wollen, du wirst jedenfalls viel lernen.
Nicht nur über den Bau von Compilern, sondern auch über den Aufbau von Programmen.
Vom schreiben eines echten Assemblers und Linkers für WinX Exe'n oder auch für andere BS würde ich dir abraten. Da ist der Aufwand für einen einzelnen mittlerweile einfach zu groß.
Aber, es gibt frei verfügbare Assembler mit denen man für so ziemlich jede Plattform übersetzen kann. Wenn dein Compiler nicht Binärcode, sondern Assemblercode erstellt den du einem Assembler zum erzeugen einer Exe übergeben kannst, dann nimmt dir der Assembler den, aus meiner Sicht, unschönsten Teil der ganzen Sache nicht nur vollständig ab, er optimiert dein Programm auch gleich noch ein bisschen.
Ich spreche an dieser Stelle aus Erfahrung. Ich selber habe mich jahrelang mit dem Bau von Compilern und der Entwicklung einer eigenen Programmiersprache befasst und viele Fehlschläge hinnehmen müssen. Leider habe ich irgendwann das ganz aus Zeitmangel in die Ecke gestellt, in der Hoffnung wieder Zeit zu finden und diesem lahmen Interpreter durch was besseres zu ersetzen.
Boldar - Mi 06.08.08 11:07
übrigens heisst es Compiler und nicht Compilierer
K.S.M. - Sa 09.08.08 18:53
So, ich schließe diesen Thread erstmal :D
Vielen Dank für die Hilfe! Ich werde mich jetzt als erstes mit ASM auseinandersetzen und dann mit dem Umwandeln von ASM in Maschinencode und dann in das Umwandeln von meiner Programmiersprache in ASM.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!