2010-09-29 18 views
11

Na przykład:Jak mogę przetłumaczyć zestaw na binarny?

 .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

Jaką architekturę? –

+0

Procesor to NIOS2. Czy to ma znaczenie? – JustinBieber

Odpowiedz

20

To znaczy, że przez ręce?

Ręcznie pobieramy arkusz instrukcji dla mikroprocesora, poznajemy tryby adresowania i inne problemy z reprezentacją danych, a następnie przekształcamy je w coś wygodnego, na przykład w notację szesnastkową.

Następnie należy wprowadzić te informacje do pamięci urządzeń, używając procesu specyficznego dla urządzenia (plik z dysku, plik z linii szeregowej, wpisany z panelu przedniego z kilkoma przełącznikami).

Oczywiście, mogą występować różne rodzaje problemów z łańcuchem narzędzi, które trzeba wymyślić, aby umieścić swój plik binarny w maszynie. Jeśli robisz to po prostu dla śmiechu, szesnastkowy, ołówek i podkładka od lat pasują do wielu lat.

Edytuj -

Musisz wiedzieć kilka rzeczy.

Po pierwsze, kody operacyjne i kody operacyjne muszą znać tryby adresowania.

Rozważ to 6502:

LDA #$00 
LDA $00 
LDA $1234 

To są trzy różne instrukcje dotyczące 6502.

Pierwsze ładunku akumulatora (A) z $ 00, 0 w hex. Symbol # informuje asembler, że używasz "bezpośredniego" trybu adresowania (6502 ma 13 trybów całkowitego adresowania).

Drugi ładuje Akumulator z wartością lokalizacji pamięci pod adresem $ 0000. W modelu 6502 ma tryb "zerowej strony", dzięki czemu można łatwiej uzyskać dostęp do pamięci z pierwszej strony pamięci (adresy 0000- $ 00FF).

Trzeci ładuje Akumulator z wartością lokalizacji pamięci pod adresem 1234 USD. To jest adresowanie absolutne, po prostu określając rzeczywisty adres pamięci, którą jesteś zainteresowany.

Podkreślam ten przykład, ponieważ na pierwszy rzut oka wszystkie te trzy wyglądają tak samo. Ale tak naprawdę, wszystkie kompilują się do 3 różnych instrukcji lub opcodów. Dlatego ważne jest, aby zrozumieć, co mówi zespół, aby można było wybrać poprawny kod operacyjny procesora.

Teraz, jeśli spojrzysz na opcode guide dla 6502 i przejrzysz instrukcję LDA, zobaczysz różne, binarne wartości dla każdej instrukcji.

Tak więc, w tym przypadku, co można uzyskać:

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

to jest binarny (w hex) reprezentowania tych 3 instrukcji.

Pierwsza, A9, przeznaczona jest do "bezpośredniego" trybu adresowania, druga, A5, do adresowania strony zerowej, a na koniec do $ AD dla Absolutu.

Należy również zauważyć, że po argumentach są argumenty. W przypadku 6502, po prostu podążają za strumieniem bajtów. Różne procesory robią różne rzeczy.Zauważ, że dla Absolutu mamy 2 bajty, 12 $ i 34 $, z których każdy reprezentuje połowę całego, 16-bitowego adresu. Uważam, że to prawda, że ​​najważniejszy bajt adresu jest najważniejszy, ale może być odwrócony ($ A9 34 $ 12).

To podstawa ręcznego składania.

Inną rzeczą wartą zapamiętania są problemy, takie jak lokalizacja, w której zostanie załadowany zespół. To wpłynie na wartości dla takich rzeczy jak twoje etykiety.

W 6502:

label: LDA #$00 
     JMP label 

Jeśli zespół jest począwszy od adresu $ 1000, to będzie to zebrać do:

$A9 $00 
$4C $10 $00 

Jeśli montaż zaczyna się od adresu $ 5555, a następnie:

$A9 $00 
$4C $55 $55 

Zobacz, instrukcja JMP (skok) (4C) potrzebuje adresu do skoku i etykiety w twoim assemie bly jest względne względem jego lokalizacji w programie. Dogodnie w tym przypadku etykieta jest na samym początku. Ale możesz zobaczyć, jak adres jest kodowany do końcowego kodu maszynowego.

6502 to ŁATWY (naprawdę łatwy) montaż. Nowoczesne procesory, cóż, nie są. Nowoczesne asemblery wykonują dla ciebie dużo pracy, a ty masz bardziej skomplikowane procesory z większymi zestawami instrukcji i takie rzeczy jak problemy z wyrównaniem - te wszystkie są niedostępne w 6502. Ale jako asembler ręczny, jesteś odpowiedzialny za wszystkie te niuanse.

Twój mikroprocesorowy podręcznik ma ci powiedzieć te niuanse. Ale dzięki nowoczesnym, skomplikowanym procesorom, nie jest to łatwe do zrobienia i uczenia się.

Niekoniecznie chcę cię od tego odwieść, ale bądź świadomy, że może to być dużo pracy.

Ale to jest esencja tego, co musisz zrobić.

+0

Istnieje już notacja szesnastkowa. Ale nie mogę tego naprawić. Na przykład: 0x40000 = 00000100000100011100010010000100 i nawet nie rozumiem, jak to zrobili. – JustinBieber

+1

nie, 0x40000 = 01000000000000000000. binarny 00000100000100011100010010000100 = 0x0411c484. –

+0

6502 jest właściwie małym endianem; LDA 1234 USD -> AD 34 12. Ale to tylko gnój. – Avi

1

Wszystkie asemblery, nad którymi pracowałem, zawierały funkcję binarną na liście wyników obok kodu podczas wykonywania złożenia.

Powiązane problemy