Intel 4004 Microprocessor Assembler |
Co to jest assembler as4004? |
Assembler as4004 jest bardzo prostym 2-przebiegowym asemblerem mikroprocesora Intel 4004. Pełny kod tego oprogramowania jest całkowicie napisany w języku JavaScript, więc powinien być w stanie wykonać na dowolnej platformie za pomocą przeglądarki internetowej i zaimplementowanego interpretera JavaScript. |
Funkcje Assemblera as4004 |
Uruchamianie asemblera as4004 |
Szybki start |
Ta część opisu jest przeznaczona dla tych, którzy chcą zobaczyć asembler as4004 w akcji. To może być łatwe do zrealizowania. W ramce poniżej znajduje się prosty przykład programu mikroprocesorowego Intel 4004 - dodawanie dwóch liczb 4-bitowych. Instrukcja FIM służy do inicjalizacji pary rejestrów R0=2 i R1=A. Program ładuje następnie R0 do akumulatora, dodaje zawartość R1 do akumulatora, a następnie używa instrukcji XCH do wymiany wartości R1 i akumulatora, które przechowuje wynik dodawania w R1. Następnie program wprowadza pętlę bez końca, zapisaną jako instrukcja JUN (skok bezwarunkowy), która przeskakuje na własny adres. Wystarczy skopiować ten kod i wkleić go do panelu „kod źródłowy”. Następnie kliknij przycisk „wygeneruj kod”. Jeśli wszystko pójdzie dobrze w panelu „kod obiektu”, powinien pojawić się kod wyniku w formacie HEX. |
; dodaj dwie 4-bitowe liczby na Intel 4004 ; FIM P0, $A2 ; zainicjuj: R0=2 R1=A LD R0 ; załadować R0 do akumulatora ADD R1 ; dodaj R1 do akumulatora XCH R1 ; i przechowaj w R1 DONE JUN DONE ; niekończąca się pętla jako koniec programu |
Składnia Assembler |
Instrukcje są mnemonikami, po których następuje (opcjonalny) modyfikator:KOD OP MODYFIKATORY ------- --------- OPC brak OPC D dane OPC R rejestr OPC RX para rejestrów OPC R, AA rejestr, adres OPC P, DD rejestru para , dane OPC C, AA warunek, adres OPC AAA adres Gdzie D to 4-bitowe dane R jest adresem rejestru P to adres rejestru pary AA to adres 8-bitowy AAA to adres 12-bitowy C to warunek |
[0-9] .... dziesietny
$[0-F] .... hex
%[01] .... binarny
0[0-7] .... ósemkowy
|
Identyfikatory muszą zaczynać się od litery [AZ] i zawierać litery, cyfry i znak podkreślenia [AZ, 0-9, _]. Tylko 6 pierwszych znaków jest znaczących. Wszystkie identyfikatory, liczby, kody operacyjne i pragmy nie uwzględniają wielkości liter i są tłumaczone na wielkie litery. Identyfikatory nie mogą być takie same jak prawidłowe kody. Specjalny identyfikator „*” odnosi się do licznika programu (PC).Przykłady: * = $100 .... Ustaw adres początkowy (PC) na $100 . LABEL1 LD R5 .... Zdefiniuj LABEL1 z adresem instrukcji LD. JUN LABEL2 .... Przejdź do adresu etykiety LABEL2. STORE = $080 .... Zdefiniuj 'PRZECHOWANIE' o wartości $080 . HERE = * .... Zdefiniuj 'TUTAJ' z aktualnym adresem (PC). HERE2 .... Zdefiniuj HERE2 z aktualnym adresem (PC). |
Pragmy zaczynają się od kropki (.) I muszą być jedynym wyrażeniem w wierszu:.BYTE BB .... Podaj 8-bitowy bajt przy aktualnym adresie do kodu.. .END .... Koniec źródła, zatrzymaj montaż. (znak '$' to opcja) |
; komentarz .... Dowolna sekwencja znaków zaczynająca się od średnika do końca linii są ignorowane. |
Asembler nie potrzebuje żadnego specjalnego formatowania z następującym wykluczeniem:
- między etykietą a opkodem i dowolnymi operandami musi być biała spacja. Dozwolona jest tylko jedna instrukcja na linię. |
Przykład kodu ∆ |
Ten przykładowy kod pochodzi z „MCS-4 Micro Computer Set” - Intel Corporation 1973. Przykład wykonuje logiczną „i” funkcję na danych w dwóch 4-bitowych portach wejściowych ROM i wyświetla wynik na porcie wyjściowym RAM. Ten program pokazuje, jak i4004 uzyskuje dostęp do swoich portów wyjściowych i wejściowych. Pokazuje również kilka podstawowych instrukcji (np. natychmiastowe załadowanie), podprogramy, skoki itp. |
; czterobitowa procedura „AND” na Intel 4004 ; START FIM 4P, 0 ; łADUJ ROM PORT 0 ADRES SRC 4P ; WYŚLIJ ADRES PORTU ROM RDR ; CZYTAJ WEJŚCIE A XCH 0 ; A DO REJESTRU 0 INC 8 ; łADUJ ROM PORT 1 ADRES SRC 4P ; WYŚLIJ ADRES PORTU ROM RDR ; CZYTAJ WEJŚCIE B XCH 1 ; B DO REJESTRU 1 JMS AND ; WYKONAJ "AND" XCH 2 ; WYNIK łADOWANIA C WMP ; ZACHOWAJ W PORCIE PAMIĘCI 0 JUN START ; RESTART NOP *=104 ; 'PODPROGRAM' "AND" AND CLB ; CZYŚĆ AKUMULATOR I 'PRZENIESIENIE' XCH 2 ; CZYŚĆ REJESTR 2 LDM 4 ; łADUJ PĘTLA LICZ (LC) AND_3 XCH 0 ; ZAłADUJ A, LC DO REJESTRU 0 RAR ; OBRÓĆ NAJMNIEJ ZNACZĄCY BII DO PRZENIESIENIA XCH 0 ; POWRÓT OBRÓCONY A DO REG 0, LC DO ACC JCN CZ, ROTR1 ; SKOK DO ROTR1 JEŚLI PRZENIESIENIE ZERO XCH 1 ; ZAłADUJ B, LC DO AKUMULATORA RAR ; OBRÓĆ NAJMNIEJ ZNACZĄCY BIT DO PRZENIESIENIA XCH 1 ; POWRÓT OBRACANY B DO REG 1, LC DO ACC ROTR2 XCH 2 ; ZAłADUJ REZULTAT CZĘŚCIOWY C, LC DO REG 2 RAR ; OBRÓĆ PRZENIEŚ DO CZĘŚCIOWEGO REZULTATU MSB XCH 2 ; ZAłADUJ LC, POWRÓT C DO REJESTRU 2 DAC ; ZMNIEJSZENIE AKUMULATORA (LC) JCN ANZ, AND_3 ; PĘTLA JEŻELI LC NIE ZERO BBL 0 ; POWRÓT ROTR1 XCH 1 ; ZAłADUJ B, LC DO REJESTRU 1 RAR ; OBRÓĆ B XCH 1 ; POWRÓT OBRACANY B DO REG 1, LC DO ACC CLC ; CZYŚĆ PRZENIESIENIE JUN ROTR2 ; POWRÓT DO PĘTLI CZ=10 ANZ=12 $ |