Ich schreibe einen 8086 Assembler für ein College-Projekt. Ich habe Material über Compilerdesign im Internet gelesen und lese das "Drachenbuch" von Compilern. Aber das Problem ist, dass ich hier nicht viel über den zusammensetzenden (generierenden Objektcode) Teil finden konnte. Gibt es gute Bücher oder Links für Assembler Design? Wo fange ich an? Ich habe lexikalische Analyse, Parsing und Zwischencode-Generierung durchlaufen.Einen Assembler schreiben, brauche Hilfe
Antwort
Können Sie einfach eine .COM-Datei kicken und generieren? Es wird in ein Code-Segment bei: 0100 geladen und mit CS, DS, ES und SS ausgeführt, die alle auf dieses Segment zeigen.
Wenn Sie das tun könnten, dann wird das Generieren von Code viel einfacher.
Ihr Testprogramm wäre einfach
mov dx, 110
mov ah,9
int 21h
mov ax,4c00
int 21
at address 110:
"Hello, World!" 0d 0a 24
Sie müssen eine Zuordnung zwischen mnemonic Anweisungen wie MOV und Opcodes sehen OpcodeMap. Außerdem benötigen Sie die Information, wie viele Argumente (und Breite der Operatoren) eine Anweisung benötigt (codiert in Bitfeldern, das spart Ihnen viel Zeit, wenn Sie das richtig machen).
Ich bezweifle, dass das Drachenbuch Ihnen viel helfen wird.
The Art of ASSEMBLY LANGUAGE PROGRAMMING ist eine gute Referenz.
Der Link scheint kaputt zu sein. Ist das das gleiche: http://cs.smith.edu/~thiebaut/ArtOfAssembly/artofasm.html –
Das Drachenbuch ist völlig falsch, da ein Assembler kein Compiler ist. Die "Grammer" einer Assembler-Zeile ist extrem einfach (reguläre Grammatik - nicht kontextsensitiv).
Der Codegenerierungsteil für einen Assembler ist fast nicht vorhanden. Holen Sie sich ein gutes Nachschlagewerk über die Opcodes Ihrer Ziel-CPU und generieren Sie nur die Bytes wie erklärt.
Da sind ein paar nette einfache Assembler da draußen und Sie sollten sie betrachten. Lernen durch Lesen von Code ist eine sehr effektive Möglichkeit für ein College-Projekt. Sie werden es brauchen, weil der Intel Assembler-Code extrem hässlich ist, zumindest wenn Sie einige der Erweiterungen als Ziel haben wollen.
versuchen Sie, llvm Compiler-Infrastruktur zu verwenden.
- 1. Assembler-Codierung Hilfe erforderlich
- 2. RegExp Hilfe (funktioniert, aber brauche einen Ausschluss)
- 3. Ich brauche Hilfe über einen Spracherkennungscode
- 4. Einen benutzerdefinierten Tokenizer in C für einen LC3 Assembler schreiben
- 5. django brauche Hilfe beim Schreiben von benutzerdefiniertem Feld
- 6. brauche Hilfe: python3.5.2 & pygame
- 7. brauche Hilfe bei der Datenbankverbindung
- 8. Einen Assembler erstellen
- 9. brauche Hilfe bei der Datenbankerstellung
- 10. System.Reflection.TargetInvocationException; brauche Hilfe zu verstehen
- 11. Rekursive Perl Detail Hilfe brauche
- 12. brauche Hilfe in Python-Liste
- 13. TI DSP-Programmierung - ist C schnell genug oder brauche ich einen Assembler?
- 14. Boost Asio serial_port - brauche Hilfe mit io
- 15. Ich brauche Hilfe mit Android und Java
- 16. brauche Hilfe für den Aufruf der Funktion
- 17. brauche Hilfe in C# und SQL
- 18. brauche Hilfe Verbindung zu MySQL mit PHP
- 19. brauche Hilfe, um ein Argument zu setzen
- 20. Scala Typ Konvertierung Fehler, brauche Hilfe!
- 21. brauche Hilfe CSS-Zentrierung mit absoluter Positionierung
- 22. MVC Routing-Problem, brauche Hilfe einfügen Parameter
- 23. Broken Function brauche etwas Hilfe/Beratung
- 24. brauche Hilfe auf Achterneben für Android
- 25. PHP + MsSQL = Checkbox Probleme. Brauche Hilfe!
- 26. Einen Z80-Assembler schreiben - ASM lexieren und einen Parsing-Baum mithilfe der Komposition erstellen?
- 27. Hilfe Verständnis DIV-Anweisung in x86-Inline-Assembler
- 28. Fragen über Javascript Variable, brauche Hilfe ~
- 29. Ich brauche Hilfe Start dieses Radioprogramm
- 30. brauche Hilfe Tabs für jquery Tabs Plugin
Hmm. Erinnerungen aus der Vergangenheit sind mir beim Lesen deines Codes in Erinnerung geblieben. Es war eine lange Zeit ... –
@Yves: Same hier, schrieb das gleiche Programm in 80886, Z80, 6301, 6502 und 1802 im Laufe der Jahre, aber keine in den letzten zehn Jahren. –
große Antwort, aber Sie sollten vielleicht darauf hinweisen, dass das obige Beispiel entweder MS-DOS oder eine MS-DOS-Shell unter Windows erfordert. Gott weiß nur, wo int 21 Sie in anderen OS's –