Czy to język asemblera?


70

W dzieciństwie programowałem na radzieckim kalkulatorze MK-61 . Miał cztery rejestry operacyjne (X, Y, Z, T) i 15 rejestrów pamięci. Program może mieć 105 kroków.

O ile pamiętam, miał takie polecenia jak:

  • Zamień rejestry X i Y
  • Rejestry przesuwne (od Z do T, od Y do Z, od X do Y)
  • Skopiuj z rejestru pamięci (1..15) do X
  • Skopiuj z X do rejestru pamięci (1..15)
  • Jeśli X <0, przejdź do kroku programu ##
  • Wykonaj operację (+, -, *, /) przy użyciu wartości X i Y i umieść wynik w X

Czy to polecenie ustawia język asemblera? Czy miałem podstawowe pojęcie o asemblerze przy użyciu tego urządzenia?

Urządzenie

Okazuje się, że jest to tak zwane „programowanie naciśnięcia klawisza” .

Zabawny fakt: podobny kalkulator (jak ten, ale z pamięcią niezależną od energii) został użyty jako zapasowy sprzęt do obliczeń trajektorii misji kosmicznej w 1988 r .:-)


Miły! - to zdjęcie przywraca wspomnienia. Nadal mam gdzieś moją MK-52 w piwnicy :)
DXM,

Wygląda to jak radziecki klon HP 65. Można go zaprogramować w odwrotnej notacji polskiej za pomocą operacji pchania i ciągnięcia stosu. Operatory RPN są po prostu zapisywane w pamięci i interpretowane przez coś, co prawdopodobnie odpowiada procesorowi 4004. Kod w pamięci ROM 4004 został prawdopodobnie skompilowany z asemblera 4004, ale naciśnięcia klawiszy są bardziej podobne do makr arkuszy kalkulacyjnych.
Meredith Poor

Odpowiedzi:


13

To nie jest język asemblera, to jest język maszynowy.

Język maszyny to wszystko, co fizycznie coś znaczy dla maszyny. W przypadku komputerów kieszonkowych są to naciśnięcia klawiszy, zakodowane w liczbach w maszynie. Nie podajesz więcej informacji na temat tej maszyny Electronika MK61 , więc podam przykład TI-57 : język maszyny użył numeru klucza podanego jako kolumna w dziesiątkach i linii w jednostkach. Na przykład programem zwiększającym pamięć 8 byłby:

33 8  57 1 58 23

To jest język maszynowy: to jest bezpośrednio interpretowane przez maszynę.

Językiem asemblera byłby tekst czytelny dla człowieka :

RCL 8 
+
1
=
STO 8

Aby przekształcić ten tekst w sekwencję kodów maszynowych, potrzebujesz asemblera , którym może być program lub człowiek, który przetłumaczy ten tekst na ciąg liczb.

Zamieszanie jest często dokonywane, ponieważ często istnieje całkiem bezpośrednie tłumaczenie z języka asemblera na język maszynowy, ale nie zawsze jest to całkowicie bezpośrednie tłumaczenie: asemblery makr mają potężne makra, które mogą wykonać wiele pracy w asemblerze i wygenerować wiele instrukcji języka maszynowego z jednej instrukcji montażu. Zwykłe tłumaczenie adresów symbolicznych może wymagać zmiany kodu operacyjnego instrukcji rozgałęzienia (na przykład podczas przełączania z krótkiego adresowania względnego na długie adresowanie względne lub bezwzględne), więc nie zawsze jest tak bezpośrednie, jak mogłoby się wydawać.


36

Powiedziałbym, że odpowiedź na obie części twojego pytania brzmi: nie. Polecenia tego kalkulatora nie są jak język asemblera, a programowanie tego kalkulatora różni się od programowania w asemblerze.

„Język”, w którym ten kalkulator jest zaprogramowany, jest dość niski, ale nadal stanowi abstrakcję na konstrukcjach niższego poziomu, które nie są dla ciebie widoczne jako programista. Zgaduję trochę, ale z twojego opisu i od spojrzenia na klawiaturę (i porównanie jej z podobnie wyglądającymi kalkulatorami Hewlett Packard lub Texas Instruments z przełomu lat 70. i 80.) powiedziałbym, że każdy program „krok” „nie tylko może być prostą operacją, taką jak„ dodaj ”lub„ zamień X i Y ”, ale także bardziej złożonymi operacjami, takimi jak trygonometria, potęgowanie, logarytmy itp. Każdy z tych kroków jest prawdopodobnie implementowany jako wewnętrzna procedura mikrokodowana. Ten mikrokod prawdopodobnie jest zaprogramowany w języku asemblera, ale nie sądzę, że

Jak inni opisali, język asemblera zwykle jest bardzo blisko (jeśli nie 1: 1) korespondencji z wyposażeniem bazowej maszyny. Powiedziałbym, że programowanie w asemblerze zawiera następujące cechy, które prawdopodobnie nie są obecne w programowaniu tego kalkulatora.

  • Operacje obejmują operacje niższego poziomu, takie jak bitowe AND, OR, XOR, przesunięcie; arytmetyka liczb całkowitych i (być może) zmiennoprzecinkowych, na różnych wielkościach danych (np. pojedyncza lub podwójna precyzja); ładuj / przechowuj różne rozmiary (bajt, półsłówko, słowo itp.).

  • Operacje na wyższym poziomie (trygon, logarytmy) są zwykle wywołaniami podprogramów, a nie instrukcjami. Istnieją pewne wyjątki, takie jak DEC VAX, który miał instrukcję oceny wielomianu. [Edycja: OP wskazała, że ​​x87 ma również funkcje wyzwalania.]

  • Schemat adresowania urządzenia jest widoczny. Jeśli przestrzeń adresowa jest podzielona na segmenty, musisz załadować adres bazowy do rejestru, a następnie kod adresowy lub dane dotyczące tego rejestru. Nawet przy płaskiej przestrzeni adresowej masz świadomość adresów i arytmetyki adresów. Zwykle asemblery pozwalają programistom używać etykiet do oznaczania adresów. Ale jeśli adres znajduje się w innym segmencie, może być konieczne załadowanie rejestru segmentu, zanim będzie można do niego dotrzeć.

  • Wyrównanie pamięci jest widoczne. Na przykład na wielu komputerach 4-bajtowe słowo można załadować lub zapisać tylko na adresy, które są wielokrotnościami 4 bajtów.

  • Reprezentacja danych jest ujawniona. Zwykle asemblery zapewniają pewien sposób określania danych liczbowych w danych szesnastkowych, ósemkowych, dziesiętnych, zmiennoprzecinkowych, a czasami w znakach.

  • Specjalizacja rejestrów jest ujawniona. Niektóre architektury zezwalają na operacje na liczbach całkowitych i adresach w niektórych rejestrach, ale zmiennoprzecinkowe tylko w innych rejestrach lub na adresowanie tylko w odniesieniu do niektórych rejestrów. Czasami istnieją wyspecjalizowane rejestry, takie jak te z bitami warunku lub statusu, których nie można użyć do adresowania lub arytmetyki.

  • Ujawniono konwencje wywoływania podprogramów. Argumenty i zwracane wartości mogą być przekazywane do rejestrów lub wypychane i wyskakiwane ze stosu. (Ten stos jest zwykle obszarem pamięci adresowanym przez specjalny rejestr wskaźnika stosu, a nie ustalonym zestawem, takim jak XYZ i T.)

  • Być może trzeba być świadomym sposobu interakcji z systemem operacyjnym, a jeśli go nie ma, jak radzić sobie z urządzeniami niskiego poziomu. W systemie operacyjnym musisz załadować argumenty do rejestrów (lub stosu) i uwięzić je w jądrze. Bez systemu operacyjnego prawdopodobnie masz do czynienia z przerwaniami i licznikami czasu.

Przypominam sobie programowanie asemblera, że ​​jest bardzo, bardzo bolesne. Myślę, że programowanie tego kalkulatora jest łatwe i przyjemne dla porównania. (Przepraszam.)


1
1) Cóż, to ma pewne działanie bitowe AND, OR, XOR, NOT - niebieskie symbole , , i ИНВ(co oznacza INV) na klawiaturze. 2) Myślałem, że sinus, cosinus itp. Są instrukcjami zgodnymi z tym odnośnikiem ref.x86asm.net/coder32.html dla procesorów x86. Ale oczywiście zgadzam się z tobą, że asembler jest o wiele bardziej skomplikowany.
defhlt

Jeśli chcesz Referencje dla tej instrukcji VMS ustawić operację - deathrow.vistech.net/... . Inne zabawne elementy można znaleźć w esolangs.org/wiki/…

25

Tak, to zdecydowanie brzmi dla mnie jak język asemblera.

Trudno powiedzieć, czy to rzeczywiście jest montaż tylko z opisu, ponieważ definicja - język, którego polecenia map 1: 1 z kodu maszynowego swój cel platformy - jest trudna do określenia bez znajomości samego kodu maszynowego, ale to brzmi jak sposób, w jaki ASM działa na innych platformach.


11

Z pewnością ma pewne bliskie podobieństwa do języka asemblera, ale zamierzam argumentować, że tak nie jest.

W języku asemblera operacje najczęściej odwzorowują instrukcje od 1 do 1 na CPU. Istnieją pewne wyjątki, takie jak makra i pseudo-ops (np. Instrukcja CLEAR, która naprawdę XOR rejestruje sama); prawdziwym punktem jest to, że program asemblera dokładnie określa generowane instrukcje CPU. (To podstawowa różnica między językiem asemblera a językiem wyższego poziomu, takim jak C; w tym ostatnim programy określają zachowanie ).

Kalkulator niewątpliwie ma w sobie procesor, ale wątpię, aby poszczególne instrukcje procesora odnosiły się do „rejestrów” X, Y, Z i T lub wykonywały operacje na wysokim poziomie, takie jak xylub sin(lub ПРГcokolwiek to znaczy!).

Zamiast tego jestem pewien, że wiele lub większość widocznych operacji jest wykonywanych jako wywołania podprogramów. I dla każdej wykonanej operacji należy wykonać znaczną ilość dodatkowej pracy wykonanej w celu wyświetlenia wyniku.

Możesz myśleć o widocznych operacjach jako o asemblerze dla maszyny wirtualnej wysokiego poziomu, ale ta maszyna wirtualna jest implementowana przez coś w rodzaju interpretera działającego na prawdziwym procesorze.

Mimo to powiedziałbym, że odpowiedź na drugą część twojego pytania:

Czy mam podstawową koncepcję języków asemblacyjnych przy użyciu tego urządzenia?

jest tak.


1
Nasze skrzynki również nie mają AX, BX, CX i DX - języki asemblera są dozwolone w tłumaczeniu symbolicznym. Zgadzam się, że funkcje wysokiego poziomu z pewnością nie są asemblerowe, ale zauważam, że to, co wymienił, nie zawierało ich. Chociaż myślę, że jest mało prawdopodobne, że tak naprawdę był to język asemblera (aby tryb adresowania mógł działać, wszystko musiałoby mieć określoną długość), żadne z wymienionych poleceń nie wykracza poza to, co ma asembler na PC.
Loren Pechtel

2
„jeśli X <0, to przejdź do kroku programu ##” to prosta instrukcja montażu BMI (rozgałęzienie, jeśli minus).
mouviciel

1
@mouviciel I nawet jeśli platforma nie obsługuje bezpośrednio czegoś takiego jak BMIprzykład, IF ... THEN ...są ogólnie czytane jako dwie instrukcje: najpierw porównanie ( x < 0w tym przypadku), a następnie działanie oparte na wyniku tego porównania (najprawdopodobniej skok podczas pracy w języku asemblera). W Intel 8086 coś podobnego (zakładając, że xjest w AX) CMP AX, 0 JNL After_IfThen_Block. (JNL to Jump If Not Less; w języku wyższego poziomu brzmiałoby to jak coś if not (x < 0) then goto After_IfThen_Block, co jest takie samo jak if (x >= 0) then {code until there}.)
CVn

1
ПРГ(PRG - programowanie) to tylko meta klawisz, aby przejść do trybu programowania, a nie jakiejś funkcji.
Oleg V. Volkov

1
@mouviciel: Jestem sceptyczny, że „jeśli X <0, to przejdź do kroku programu ##” jest faktycznie zaimplementowany jako pojedyncza instrukcja procesora sprzętowego. Spekuluję, że program wprowadzony do kalkulatora nie jest przechowywany jako sekwencja instrukcji procesora; raczej jest przechowywany jako sekwencja instrukcji wyższego poziomu, które są interpretowane przez oprogramowanie układowe. Nigdy nie pracowałem z tym kalkulatorem, ale korzystałem z HP-48; zestaw instrukcji widoczny dla użytkownika bardzo różni się od zestawu procesora Saturn, którego używa.
Keith Thompson,

9

Zgadza się, opublikowany fragment kodu wygląda jak język asemblera . Prawidłowa konwersja tego kodu zdefiniowałaby wersję.

Edycja: ma określony język dla tego urządzenia, ale nie jest asemblerem.

Wygląda również jak kalkulator wykonany przez ZSRR. Czy działa na zaokrąglonych bateriach / przewodzie?


3
Zgadza się, był produkowany na sowieckiej Ukrainie od połowy lat 80-tych. Mam jeden wyprodukowany w 1991 roku. Ma oba gniazda na 3 baterie AA i adapter 220 V.
defhlt

1
To jest dla mnie naprawdę nostalgiczne. Pamiętam tę markę „Elektronika” :)
EL Yusubov

3

Twierdzę, że jesteś bliżej hybrydy asemblera w języku BASIC, ale tak naprawdę zależy to od procesora i architektury. Nie trzeba mieć bezpośredniego dostępu do pamięci, jeśli nie ma się prawdziwej pamięci RAM. Operacje zmiennoprzecinkowe również nie muszą być obecne bez FPU.

Myślę, że prosty test byłby operacją dodawania liczby zmiennoprzecinkowej i liczby całkowitej. Większość języków programowania wyższego poziomu akceptuje ADD 2.5, 7 i zwraca 9.5. Języki asemblera różniłyby jednak wynik w oparciu o wywoływaną instrukcję i zależnie od reprezentacji liczb bazowych w formacie binarnym. Większość języków asemblera wymaga użycia innej instrukcji opartej na operacjach zmiennoprzecinkowych i liczbach całkowitych. Wyjątkiem może być jakiś format stałego punktu.


Może po prostu traktować wszystkie liczby jako liczby zmiennoprzecinkowe i rozważyć jeden z argumentów 7.0.
Oleg V. Volkov

@ OlegV.Volkov może jednak potrzebujesz tylko dwóch liczb zmiennoprzecinkowych, których suma nie ma prawdziwej reprezentacji. Możesz również odszukać błędy anulowania odejmując.
Peter Smith

3

Kalkulatory odwrotnej notacji polskiej (RPN) były klasyczne. Nie, chociaż oznaczenia rejestrów wydają się być językiem asemblera, tak nie było. Obliczenia wykonano przez przełożenie z formatu algebraicznego na stos. Użyte liczby zostały wepchnięte do stosu i operacje były wykonywane na ostatnim stosie względem wartości ostatniego stosu.

Możesz „obrócić” stos, aby przenieść wartości, ponieważ wyświetlana wartość była elementem stosu. Wyniki można zamieniać lub układać w stosy w razie potrzeby, aby wykonać prawie złożone obliczenia. Jeśli znasz język stosu i asemblera, kalkulator był łatwy do nauczenia, ponieważ jego paradygmat był najbardziej podobny.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.