2010-09-29 9 views
11

Zum Beispiel:Wie übersetze ich Assembly in binär?

 .text 
     .align 2 
     .global main 
     .equ val,0x4712   # 16-bit binary code for 0x4712: 0100 0111 0001 0010 
           # Program code starts now 
main:       # This label must be main:, not MAIN: 
     movi r16,val   # WHAT WOULD THIS LINE BE IN BINARY? 
     movi r17,0 
loop: addi r17,r17,1 
     subi r16,r16,1 
     bne r16,r0,loop 
stop: br stop 
.end 
+1

Welche Architektur? –

+0

CPU ist NIOS2. Ist es wichtig? – JustinBieber

Antwort

20

Sie meinen, mit der Hand?

Mit der Hand greifen Sie das Anweisungssatzblatt für Ihren Mikroprozessor, verstehen Ihre Adressierungsmodi und andere Datenrepräsentationsprobleme, und konvertieren Sie dann das zu etwas bequemem, wie eine hexadezimale Notation.

Dann müssten Sie diese Informationen in den Speicher der Geräte, mit einem bestimmten gerätespezifischen Prozess (Datei von der Festplatte, Datei von der seriellen Leitung, eingegeben von einem Frontpanel mit einer Reihe von Schaltern).

Offensichtlich kann es alle Arten von Tool-Chain-Problemen geben, die Sie herausfinden müssen, um Ihre Binärdatei in eine Maschine zu bekommen. Wenn du es nur für Lacher machst, haben hexadezimal, ein Bleistift und ein Schreibblock viele Jahre lang gepasst.

Bearbeiten -

Sie müssen mehrere Dinge wissen.

Zuerst die Op-Codes, und zusammen mit den Op-Codes müssen Sie die Adressierungsmodi kennen.

Betrachten Sie diese 6502:

LDA #$00 
LDA $00 
LDA $1234 

Das sind drei verschiedene Anweisungen auf den 6502.

Die erste lädt den Akkumulator (A) mit $ 00, 0 in hex. Das Symbol # teilt dem Assembler mit, dass Sie den "direkten" Adressierungsmodus verwenden (der 6502 hat insgesamt 13 Adressierungsmodi).

Der zweite lädt den Akkumulator mit dem Wert des Speicherplatzes an der Adresse $ 0000. Auf dem 6502 hat es einen "Zero Page" -Modus, so dass es einfacher von der ersten Seite des Speichers (Adressen $ 0000 - $ 00FF) auf den Speicher zugreifen kann.

Der dritte lädt den Akkumulator mit dem Wert des Speicherplatzes an Adresse $ 1234. Dies ist eine absolute Adressierung, indem einfach die tatsächliche Adresse des Speichers angegeben wird, an dem Sie interessiert sind.

Ich erwähne dieses Beispiel, weil auf einen Blick alle drei gleich aussehen. Aber in Wahrheit kompilieren sie alle zu 3 verschiedenen Befehlen oder Opcodes. Es ist also wichtig zu verstehen, was Ihre Assembly Ihnen sagt, damit Sie den richtigen Opcode für Ihren Prozessor auswählen können.

Wenn Sie nun einen opcode guide für den 6502 betrachten und den LDA-Befehl nachschlagen, sehen Sie die verschiedenen binären Werte für jeden Befehl.

in diesem Fall also würden Sie erhalten:

$A9 $00 
$A5 $00 
$AD $12 $34 

, dass die binäre (in hex) Darstellung dieser drei Anweisungen ist.

Der erste, $ A9, ist für den "unmittelbaren" Adressierungsmodus, der zweite, $ A5, für die Nullseitenadressierung und schließlich $ AD für Absolute.

Beachten Sie auch, dass nach den Operanden die Argumente sind. Für den 6502 folgen sie nur im Bytestrom. Unterschiedliche Prozessoren machen verschiedene Dinge.Beachten Sie, dass wir für das Absolute 2 Bytes, $ 12 und $ 34 haben, die jeweils die Hälfte der gesamten 16-Bit-Adresse repräsentieren. Ich glaube, das ist richtig, dass das Most Significant Byte der Adresse zuerst kommt, aber es könnte umgekehrt werden ($ A9 $ 34 $ 12).

Also, das ist das Fundament der Montage von Hand.

Andere Dinge zu beachten sind Fragen, wie Ort, an dem die Baugruppe geladen wird. Das beeinflusst die Werte für Dinge wie Ihre Etiketten.

In 6502:

label: LDA #$00 
     JMP label 

Wenn Ihre Montage an der Adresse beginnt, $ 1000, das dies montieren zu:

$A9 $00 
$4C $10 $00 

Wenn Ihre Montage an der Adresse beginnt $ 5555 dann:

$A9 $00 
$4C $55 $55 

Sehen Sie, die JMP (Jump) Anweisung ($ 4C) benötigt eine Adresse zu springen, und die Bezeichnung in Ihrer Assem bly ist relativ zu seiner Position im Programm. Praktischerweise steht in diesem Fall das Etikett ganz am Anfang. Sie können jedoch sehen, wie die Adresse im endgültigen Maschinencode codiert ist.

6502 ist EASY (wirklich einfach) Montage. Moderne Prozessoren sind es nicht. Die modernen Assemblierer machen eine Menge Arbeit für Sie, und Sie haben kompliziertere CPUs mit größeren Befehlssätzen und Dingen wie Ausrichtungsproblemen - diese fehlen alle im 6502. Aber als Handassembler sind Sie für alle verantwortlich diese Nuancen.

Ihr Mikroprozessor-Handbuch soll Ihnen diese Nuancen vermitteln. Aber mit den modernen komplizierten CPUs ist es wahrscheinlich nicht trivial zu tun und zu lernen.

Ich möchte Sie nicht unbedingt davon abhalten, aber seien Sie sich bewusst, es könnte eine Menge Arbeit sein.

Aber das ist die Essenz dessen, was Sie tun müssen.

+0

Es gibt bereits eine hexadezimale Schreibweise. Aber ich kann es nicht richtig machen. Zum Beispiel: 0x40000 = 00000100000100011100010010000100 und ich verstehe nicht, wie sie es bekommen haben. – JustinBieber

+1

nein, 0x40000 = 01000000000000000000. binär 00000100000100011100010010000100 = 0x0411c484. –

+0

Der 6502 ist eigentlich Little Endian; LDA $ 1234 -> AD 34 12. Aber das ist nur eine Nisse. – Avi

1

Alle Assembler, mit denen ich gearbeitet habe, verfügten über eine Funktion, die Binärdatei in die Ausgabeauflistung neben dem Code aufzunehmen, wenn eine Assembly ausgeführt wurde.

Verwandte Themen