ARM Befehlssatz



  • Hallo Zusammen.
    Ich bin gerade dabei,einen Disassembler bzw. Assembler zu schreiben.
    Und auch so würde ich gerne die Maschinensprache lernen.
    Allerdings werde ich noch nicht so ganz schlau aus der Referenz von ARM.
    Meine Fragen dazu und auch allgemein:
    Allgemein:
    -Sind die Befehlssätze bei den unterschiedlichen Prozessoren ähnlich?
    ARM:
    -Woher weiß ich wie lange ein Befehl ist, da ja nicht alle 4Byte lang sind?
    -Woher weiß ich welcher Befehl jetzt ausgeführt wird, denn da hab ich auch nichts eindeutiges gefunden?
    -Was ist ein sogenannter "Branch" und "Branch" mit Link?

    Ich hab noch nicht sehr viel vertsanden, leider.
    Und die Bedeutung weiß ich bis jetzt nur von den Konditionen.

    Hoffe ihr könnt mir helfen.
    Danke.



  • Ich halte das jetzt nicht für ein geeignetes Projekt, um Assembler zu lernen. Ich halte das nicht mal für ein interessantes Projekt. Da musst du dich in sehr viele unwichtige Details reindenken, die dir im Endeffekt gar nichts bringen, außer dass du dieses eine mal einen Assembler schreibst. Nach 2-3 Befehlen wirst du wahrscheinlich auch keine Lust mehr drauf haben.

    Du musst sowas lesen:

    https://www.scss.tcd.ie/John.Waldron/3d1/arm_arm.pdf

    Bin mir jetzt nicht sicher, obs DAS richtige Dokument ist, aber du wirst auf jeden Fall so eine Referenz brauchen.

    Ich bin kein ARM Experte, aber es gibt verschiedene ARM Instruction Sets, und wenn ein Prozessor einen bestimmten Instruction Set unterstützt, dann müssen die Programme denke ich binärkompatibel sein. So ähnlich wie bei Intel und AMD. Da kanns aber sicher auch einige feine Unterschiede geben. Wie gesagt, halte ich für viel zu komplex und nicht wirklich interessant.



  • Danke 🙂
    Naja,ich will mich halt mal mit den Prozessoren direkt beschäftigen (also zuerst mal ARM).
    Und dabei lerne ich ja auch die Befehle und da ich aber mir nicht alles merken kann, will ich mir einen eigenen Assembler/Disassembler schreiben.



  • Was heißt mit Prozessoren direkt beschäftigen? Kommst du aus der Hardwareecke? Wenn du meinst, dass du einfach nur maschinennah in Assembler programmieren willst, ist es immer noch ein sehr großer Unterschied zu selber einen Assembler schreiben.
    Es ist auch ein sehr großer Unterschied, ob du nur einen Assemblerbefehl wie "ADD R1, R2" verstehen und merken musst, oder ob du jetzt wissen musst, wie genau die entsprechenden Opcodes aufgebaut sind, welche Bits man wann setzen muss, was es da für Optionen, Sonderfälle usw. gibt... Das sind eben Informationen, die niemand braucht, außer einem Prozessorhersteller und einem, der einen Assembler dafür schreiben will. Zumindest bei x86 ist es auch so, dass die Opcodes ziemlich wild aufgebaut sind und keinem festen Schema folgen (ist bei ARM aber glaube ich besser). Schau dir einfach das Dokument an und entscheide dann, ob du dich wirklich so tief in sowas reindenken willst 😉



  • Wie Mechanics schon geschrieben hat ist es keine gute Idee selber einen Assembler zu schreiben wenn du nur die Maschinensprache lernen willst., da gibts einfach zu viel was unwichtig ist wenn man nur programmieren will.
    Also falls du nur Asm verstehen willst, lass das mit dem Assembler und schau dir lieber z.B. an was ein Compiler so aus einer Hochsprache macht (ohne Optimierungen!). Da verstehst du dann warum und welche Befehle verwendet werden.

    Falls du aber tiefergehendes (prozessorspeziefisches) Verständnis suchst musst du dich drauf einstellen dass das ziemlich viel ist womit du außer für diesen speziellen Fall nicth viel mit anfangen kannst... Außerdem ist die Doku manchal recht mau und unverständlich finde ich.



  • Ja, ich finde die Dokumentation auch ziemlich unverständlich.
    Aber ich brauche nun mal einen Assembler.
    Also halt den Quellcode.
    Und ich hab zwar ein paar Opensource-Assembler gefunden, aber die funktionierten nicht so gut (eher gar nicht).
    Außerdem juckt es mich ein bisschen, mal selber die Maschinensprache zu übersetzen.
    Ich will sie auch nicht für immer lernen (also den genauen Befehlssatz, usw., deswegen schreibe ich ja auch einen Disassembler(bzw. Assembler).



  • coder++ schrieb:

    Aber ich brauche nun mal einen Assembler.
    Also halt den Quellcode.

    Ist jetzt auch nicht wirklich klar, was du willst 😉 Warum brauchst du einen Assembler und warum brauchst du den Quellcode?

    Es würde mich sehr überraschen, wenn es keine funktionierenden Asembler geben würde. Notfalls könntest du dir auch den Code vom LLVM ARM Backend anschauen.

    Gut, wenn du das unbedingt machen willst, ist es natürlich ein Argument 😉 Ich hab auch schon mal alles mögliche angefangen, was keinen Sinn macht, z.B. eine Datenbankengine.



  • coder++ schrieb:

    -Sind die Befehlssätze bei den unterschiedlichen Prozessoren ähnlich?

    Vermutlich, was soll man von so einer Risc-Kiste auch groß erwarten?

    coder++ schrieb:

    -Woher weiß ich wie lange ein Befehl ist, da ja nicht alle 4Byte lang sind?

    Aus einer Dokumentation, oder von einem Disassembler oder aus Opcodeberechnungsschemen
    äh...ach so, und Wahrscheinlichkeit, Summenberechnungen, Hexcodeanalysen, Betriebssystem (funktionen), Datenformate, Sonderbefehle, Richtlinien...

    coder++ schrieb:

    -Woher weiß ich welcher Befehl jetzt ausgeführt wird, denn da hab ich auch
    nichts eindeutiges gefunden?

    Raten?

    coder++ schrieb:

    -Was ist ein sogenannter "Branch" und "Branch" mit Link?

    Ein Sprung ins Phantasialand, um Link http://zeldawiki.org/Link zu besuchen 😉
    (oder eben ein leckeres Frühstück mit dem Typen, wer weiß)

    coder++ schrieb:

    Ich hab noch nicht sehr viel vertsanden, leider.

    Mit etwas Geduld und Ausdauer...

    http://de.wikipedia.org/wiki/ARM-Architektur
    http://elk.informatik.fh-augsburg.de/pub/stm32lab/docs/assembler1.pdf
    http://raspberrycenter.de/handbuch/assembler-programmierung
    http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html



  • Danke für die Antworten.
    Langsam fang ich an den ARM-Prozessor besser kennen zu lernen.
    Ich hab jetzt endlich auch die Opcodes vertsanden und Branch.
    Kann trotzdem noch eine Weile dauern.



  • coder++ schrieb:

    -Sind die Befehlssätze bei den unterschiedlichen Prozessoren ähnlich?

    die befehle folgen meistens den spezifikationen von arm. die cpu hersteller erweitern manchmal um ein paar dinge, aber den 'grundwortschatz' versteht jede cpu. es existiert ja schon sehr viel software und wenn ein kunde eine arm cpu kauft, will er die software drauf laufen lassen, da braechte inkompatibilitaet keinen vorteil.

    -Woher weiß ich wie lange ein Befehl ist, da ja nicht alle 4Byte lang sind?

    nicht? eigentlich sind alle ARM 32bit befehle auch selbst 32bit lang und sind auch 32bit aligned. es thumb koennen sie unterschiedlich lang sein, aber bei einem disassembler siehst du meistens im code von wo, wohin gesprungen wird. du kannst also zur not die sprungziele als startpunkte weiterer dekodierung markieren und da gibt dir jeder befehl automatisch an wo der naechste anfaengt (so laeuft es ja auf der cpu).

    -Woher weiß ich welcher Befehl jetzt ausgeführt wird, denn da hab ich auch nichts eindeutiges gefunden?

    meinst du befehlssatz? las dem user die entscheidungen welche erweiterungen er bei der disassemblierung dazu nutzen moechte (z.b. NEON).

    -Was ist ein sogenannter "Branch" und "Branch" mit Link?

    branch ist ein sprung, bei x86 'jump' genannt und bei den meisten hochsprachen 'goto'. link bedeutet dass abgespeichert wird was der naechste befehl nach dem sprungbefehl ist, dann kann die angesprungene stelle am ende dorthin zurueckspringen. (quasi ein funktionsaufruf, bei basic gibt es einen befehl der dasselbe macht namens "gosub" 😉 )

    arm und mips sind sehr nette befehlssaetze um damit assembler anzufangen.


Anmelden zum Antworten