È un linguaggio di assemblaggio?


70

Nella mia infanzia programmavo su un calcolatore sovietico MK-61 . Aveva quattro registri operativi (X, Y, Z, T) e 15 registri di memoria. Un programma potrebbe avere 105 passaggi.

Come ricordo, aveva comandi come:

  • Scambia i registri X e Y.
  • Registri a scorrimento (da Z a T, da Y a Z, da X a Y)
  • Copia dal registro di archiviazione (1..15) a X
  • Copia da X al registro di archiviazione (1..15)
  • Se X <0, vai al passaggio di programma ##
  • Eseguire l'operazione (+, -, *, /) usando i valori X e Y e mettere il risultato su X

Questo comando imposta un linguaggio assembly? Ho avuto un'idea di base dei linguaggi di assemblaggio utilizzando questo dispositivo?

Dispositivo

Si scopre che è qualcosa chiamato "programmazione della sequenza di tasti" .

Fatto curioso: un calcolatore simile (come questo, ma con memoria indipendente dall'energia) è stato usato come hardware di backup per i calcoli della traiettoria della missione spaziale nel 1988. :-)


Bello! - quella foto riporta alla mente ricordi. Ho ancora avuto il mio MK-52 nel seminterrato da qualche parte :)
DXM

Sembra un clone sovietico dell'HP 65. Può essere programmato in notazione polacca inversa con operazioni che spingono e tirano su una pila. Gli operatori RPN sono semplicemente registrati in memoria e interpretati da ciò che è probabilmente equivalente a una CPU 4004. Il codice nella ROM 4004 è stato probabilmente compilato dall'assemblatore 4004, ma i tasti sono molto più simili alle macro dei fogli di calcolo.
Meredith Poor,

Risposte:


13

Questo non è un linguaggio assembly, questo è un linguaggio macchina.

Il linguaggio macchina è tutto ciò che significa fisicamente qualcosa per la macchina. Nel caso dei computer tascabili, si tratta di premere i tasti, codificati in numeri nella macchina. Non fornisci ulteriori informazioni su questa macchina Electronika MK61 , quindi fornirò l'esempio della TI-57 : il linguaggio della macchina utilizzava il numero della chiave fornita come colonna nelle decine e la linea nelle unità. Ad esempio, un programma che aumenterebbe la memoria 8 sarebbe:

33 8  57 1 58 23

Questo è il linguaggio macchina: è ciò che viene interpretato direttamente dalla macchina.

Il linguaggio dell'assemblea sarebbe il testo leggibile dall'uomo :

RCL 8 
+
1
=
STO 8

Per trasformare questo testo nella sequenza di codici macchina, è necessario un assemblatore , che potrebbe essere un programma, o un essere umano che traduca quel testo nella sequenza di numeri.

La confusione è spesso fatta, perché spesso c'è una traduzione abbastanza diretta dal linguaggio assembly al linguaggio macchina, ma questa non è sempre una traduzione interamente diretta: gli assemblatori di macro hanno macro potenti che possono fare molto lavoro nell'assemblatore e generare un molte istruzioni di linguaggio macchina da una singola istruzione di assemblaggio. La semplice traduzione di indirizzi simbolici può comportare la modifica del codice operativo delle istruzioni di diramazione (ad esempio, quando si passa dall'indirizzamento relativo breve all'indirizzamento relativo lungo o assoluto), quindi non è sempre diretto come si potrebbe pensare.


36

Direi che la risposta ad entrambe le parti della tua domanda è no: i comandi di questa calcolatrice non sono come il linguaggio assembly e la programmazione di questa calcolatrice è diversa dalla programmazione nel linguaggio assembly.

La "lingua" in cui è programmata questa calcolatrice è di livello piuttosto basso, ma rappresenta comunque un'astrazione in cima a costrutti di livello inferiore che non sono visibili all'utente come programmatore. Sto indovinando un po ', ma dalla tua descrizione, e guardando la tastiera (e confrontandola con calcolatori dall'aspetto simile di Hewlett Packard o Texas Instruments della fine degli anni '70 e dei primi anni '80) direi che ogni programma "passo "non solo potrebbe essere un'operazione semplice come" aggiungi "o" scambia X e Y "ma anche operazioni più complesse come trigonometria, esponenziazione, logaritmi, ecc. Ognuno di questi passaggi è probabilmente implementato come una routine microcodificata interna. Quel microcodice probabilmente è programmato nel linguaggio assembly, ma non credo che '

Come altri hanno descritto, il linguaggio di assemblaggio di solito è in corrispondenza molto stretta (se non 1: 1) con le strutture della macchina sottostante. Direi che la programmazione del linguaggio assembly comprende le seguenti caratteristiche che probabilmente non sono presenti nella programmazione di questo calcolatore.

  • Le operazioni includono operazioni di livello inferiore come AND bit a bit, OR, XOR, spostamento; aritmetica in numero intero e (forse) in virgola mobile, su una varietà di dimensioni di dati (ad es. precisione singola o doppia); carico / archivio di varie dimensioni (byte, mezza parola, parola, ecc.).

  • Le operazioni di livello superiore (trig, logaritmi) sono generalmente chiamate di subroutine, non istruzioni. Vi sono alcune eccezioni, come il DEC VAX che aveva un'istruzione di valutazione polinomiale. [Modifica: OP ha sottolineato che x87 ha anche funzioni di trigger.]

  • Lo schema di indirizzamento della macchina è esposto. Se lo spazio degli indirizzi è segmentato, è necessario caricare un indirizzo di base in un registro e quindi indirizzare il codice oi dati relativi a quel registro. Anche con uno spazio degli indirizzi piatto, sei a conoscenza degli indirizzi e dell'aritmetica degli indirizzi. Solitamente gli assemblatori consentiranno ai programmatori di utilizzare le etichette per indicare gli indirizzi. Ma se un indirizzo si trova in un segmento diverso, potrebbe essere necessario caricare un registro di segmento prima di poterlo raggiungere.

  • L'allineamento della memoria è esposto. Ad esempio, su molte macchine una parola di 4 byte può essere caricata o memorizzata solo in indirizzi multipli di 4 byte.

  • La rappresentazione dei dati è esposta. Solitamente gli assemblatori forniscono un modo per specificare dati numerici in esadecimali, ottali, decimali, in virgola mobile e occasionalmente in caratteri.

  • La specializzazione dei registri è esposta. Alcune architetture consentono operazioni su numeri interi e indirizzi in alcuni registri, ma in virgola mobile solo in altri o consentono l'indirizzamento solo in relazione a determinati registri. A volte ci sono registri specializzati come quelli con bit di condizione o di stato che non possono essere utilizzati per l'indirizzamento o l'aritmetica.

  • Le convenzioni di chiamata della subroutine sono esposte. Argomenti e valori di ritorno possono essere passati nei registri o spinti e estratti da una pila. (Questo stack è generalmente una regione di memoria indirizzata da un registro puntatore dello stack speciale, non un set fisso come XYZ e T.)

  • Potrebbe essere necessario essere consapevoli di come interagire con il sistema operativo o, se non ce n'è uno, come gestire strutture hardware di basso livello. Con un SO devi caricare gli argomenti nei registri (o nello stack) e trap nel kernel. Senza un sistema operativo probabilmente dovrai occuparti di interrupt e timer.

Il mio ricordo della programmazione degli assemblaggi è che è molto, molto doloroso. Penso che la programmazione di questa calcolatrice sia semplice e divertente al confronto. (Scusate.)


1
1) Beh, ha qualche operazione bit per bit AND, OR, XOR, NOT - simboli blu , , e ИНВ(che significa INV) sulla tastiera. 2) Ho pensato che seno, coseno ecc. Sono istruzioni secondo questo riferimento ref.x86asm.net/coder32.html per processori x86. Ma ovviamente sono d'accordo con te che l'assemblatore è molto più complicato.
defhlt

Se vuoi il riferimento per quell'operazione del set di istruzioni VMS - deathrow.vistech.net/… . Alcuni altri pezzi divertenti possono essere trovati in esolangs.org/wiki/…

25

Sì, mi sembra decisamente un linguaggio di assemblaggio.

E 'difficile dire se non che in realtà è il montaggio solo dalla descrizione, perché la definizione - un linguaggio i cui comandi mappa 1: 1 con il codice macchina della sua piattaforma di destinazione - è difficile determinare senza una conoscenza del codice macchina stessa, ma suona come il modo in cui ASM funziona su altre piattaforme.


11

Ha certamente alcune strette somiglianze con un linguaggio assembly, ma ho intenzione di sostenere che non è quello che è realmente.

In un linguaggio assembly, le operazioni sono per lo più mappate da 1 a 1 alle istruzioni della CPU. Ci sono alcune eccezioni, come macro e pseudo-operazioni (come, diciamo, un'istruzione CLEAR che in realtà XOR registra un registro con se stesso); il vero punto è che un programma di assemblaggio determina esattamente le istruzioni della CPU da generare. (Questa è la differenza fondamentale tra un linguaggio assembly e un linguaggio di livello superiore come C; in quest'ultimo, i programmi specificano il comportamento ).

La calcolatrice ha indubbiamente una CPU, ma dubito che le singole istruzioni della CPU facciano riferimento ai "registri" X, Y, Z e T, o eseguano operazioni di alto livello come xyo sin(o ПРГqualunque cosa significhi!).

Invece, sono sicuro che molte o la maggior parte delle operazioni visibili vengono eseguite come chiamate di subroutine. E per ogni operazione eseguita, ci deve essere una quantità significativa di lavoro extra fatto per visualizzare il risultato.

Puoi pensare alle operazioni visibili come un linguaggio assembly per una macchina virtuale di alto livello, ma quella macchina virtuale viene implementata tramite qualcosa come un interprete in esecuzione sulla CPU reale.

Tuttavia, direi che la risposta alla seconda parte della tua domanda:

Ho avuto un'idea di base dei linguaggi di assemblaggio utilizzando questo dispositivo?

è sì.


1
Le nostre scatole non hanno nemmeno AX, BX, CX e DX - i linguaggi di assemblaggio sono consentiti traduzione simbolica. Concordo sul fatto che le funzioni di alto livello non sono certamente un assembly, ma noto che ciò che ha elencato non le include. Mentre penso sia improbabile che fosse davvero un linguaggio assembly (tutto dovrebbe avere una lunghezza fissa per far funzionare la modalità di indirizzamento) nessuno dei comandi elencati è al di là di quello che ha l'assemblatore su un PC.
Loren Pechtel,

2
"se X <0 vai al passo del programma ##" è una semplice istruzione di assemblaggio BMI (ramo se meno).
mouviciel,

1
@mouviciel E anche se la piattaforma non supporta direttamente qualcosa come l' BMIesempio, IF ... THEN ...vengono generalmente letti come due istruzioni: prima un confronto ( x < 0in questo caso), quindi un'azione basata sul risultato di quel confronto (molto probabilmente un salto quando si lavora in linguaggio assembly). In Intel 8086, qualcosa del genere (supponendo che xsia in AX) CMP AX, 0 JNL After_IfThen_Block. (JNL è Jump if Not Less; in un linguaggio di livello superiore, questo significherebbe qualcosa di simile if not (x < 0) then goto After_IfThen_Block, che è lo stesso di if (x >= 0) then {code until there}.)
un CVn

1
ПРГ(PRG - programmazione) è solo una meta chiave per passare alla modalità di programmazione, non alcune funzioni.
Oleg V. Volkov,

1
@mouviciel: Sono scettico sul fatto che "se X <0 vai al passo del programma ##" è effettivamente implementato come una singola istruzione CPU hardware. Suppongo che un programma inserito sulla calcolatrice non sia memorizzato come una sequenza di istruzioni della CPU; piuttosto, è memorizzato come una sequenza di istruzioni di livello superiore interpretate da un programma firmware. Non ho mai lavorato con questo particolare calcolatore, ma ho usato l'HP-48; il set di istruzioni visibile dall'utente è molto diverso da quello della CPU Saturn che utilizza.
Keith Thompson,

9

Esatto, il frammento di codice pubblicato assomiglia al linguaggio assembly . La corretta conversione di questo codice definirebbe la versione.

Modifica: ha un linguaggio specifico per questo dispositivo, ma non è un assembly.

Sembra anche una calcolatrice realizzata dall'URSS. Funziona con batterie / cavo arrotondati?


3
Corretto, è stato prodotto nell'Ucraina sovietica dalla metà degli anni '80. Ne ho realizzato uno nel 1991. Ha entrambi gli slot per 3 batterie AA e per l'adattatore 220v.
defhlt

1
Questo è davvero un nostalgico per me. Ricordo questo marchio "Elektronika" :)
EL Yusubov il

3

Direi che sei più vicino a un ibrido di linguaggio assembly BASIC, ma dipende davvero dalla CPU e dall'architettura sottostanti. Non è necessario l'accesso diretto alla memoria se non si dispone di RAM reale di cui parlare. Anche le operazioni in virgola mobile non devono essere presenti senza una FPU.

Penso che un semplice test sarebbe un'operazione di addizione su un numero in virgola mobile e un numero intero. La maggior parte dei linguaggi di programmazione di livello superiore accetterebbe ADD 2.5, 7 e restituire 9.5. I linguaggi di assemblaggio tuttavia differirebbero l'output in base all'istruzione chiamata e in base alla rappresentazione numerica sottostante in binario. La maggior parte dei linguaggi di assemblaggio richiede l'utilizzo di un'istruzione diversa basata sull'utilizzo di operazioni in virgola mobile rispetto a numeri interi. Un'eccezione a questo potrebbe essere una sorta di formato a virgola fissa.


Potrebbe semplicemente trattare tutti i numeri come float e considerare uno degli argomenti 7.0.
Oleg V. Volkov,

@ OlegV.Volkov forse, tuttavia devi solo scegliere due numeri in virgola mobile la cui somma non ha una rappresentazione reale. Inoltre è possibile cercare errori di annullamento nella sottrazione.
Peter Smith,

3

I calcolatori della notazione polacca inversa (RPN) erano classici. No, sebbene le designazioni dei registri sembrino un linguaggio di assemblaggio, non lo era. I calcoli sono stati eseguiti traducendo dal formato algebrico alla pila. I numeri utilizzati sono stati inseriti nello stack e le operazioni sono state eseguite sull'ultimo impilato rispetto ai valori dell'ultimo impilato.

È possibile "ruotare" lo stack per spostare i valori poiché il valore visualizzato era un membro dello stack. I risultati potrebbero essere scambiati o impilati secondo necessità per eseguire calcoli quasi complessi. Se capisci l'hardware dello stack e il linguaggio di assemblaggio, questa calcolatrice era banale da imparare poiché il suo paradigma era molto simile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.