È un linguaggio assembly?

70

Nella mia infanzia ero solito programmare su un MK-61 Soviet . 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 memoria (1..15) a X
  • Copia da X al registro di archiviazione (1..15)
  • Se X < 0 quindi vai al passo di programma ##
  • Esegui operazioni (+, -, *, /) usando i valori X e Y e metti il risultato su X

Questo comando imposta un linguaggio assembly? Ho un'idea di base delle lingue di assemblaggio utilizzando questo dispositivo?

Siscoprechesitrattadiqualcosachiamato "programmazione della sequenza di tasti" .

Un fatto curioso: una calcolatrice simile (come questa, ma con memoria indipendente dall'energia) è stata usata come hardware di riserva per i calcoli della traiettoria della missione spaziale nel 1988.: -)

    
posta defhlt 13.07.2012 - 00:00
fonte

7 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 di computer tascabili, è un tasto premuto, codificato in numeri nella macchina. Non fornisci ulteriori informazioni su questa macchina Electronika MK61 , quindi darò l'esempio di TI-57 : il linguaggio macchina usato il numero della chiave data come colonna nelle decine e linea nelle unità. Ad esempio, un programma che incrementerebbe la memoria 8 sarebbe:

33 8  57 1 58 23

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

Il linguaggio assembly sarebbe il testo leggibile :

RCL 8 
+
1
=
STO 8

Per trasformare questo testo nella sequenza di codici macchina, è necessario un assemblatore , che può essere un programma o un essere umano che tradurrebbe 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: i macro assemblatori hanno macro potenti che possono fare molto lavoro nell'assemblatore e genera molte istruzioni sul linguaggio macchina da una singola istruzione di assemblaggio. La semplice traduzione di indirizzi simbolici può comportare la modifica del codice operativo delle istruzioni di ramo (ad esempio, quando si passa da un indirizzamento relativo breve a un indirizzamento relativo o assoluto), quindi non è sempre così diretto come si potrebbe pensare.

    
risposta data 13.07.2012 - 11:29
fonte
36

Direi che la risposta a 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 in linguaggio assembly.

Il "linguaggio" in cui è programmata questa calcolatrice è di livello abbastanza basso, ma rappresenta comunque un'astrazione in cima a costrutti di livello inferiore che non sono visibili a te come programmatore. Sto indovinando un po ', ma dalla tua descrizione, e guardando la tastiera (e confrontandola con calcolatori dall'aspetto simile a Hewlett Packard o Texas Instruments tra la fine degli anni '70 e l'inizio degli anni '80) direi che ogni programma "step" "non solo potrebbe essere una semplice operazione come" aggiungi "o" scambia X & Y "ma anche operazioni più complesse come trigonometria, esponenziazione, logaritmi, ecc. Ognuno di questi passaggi è probabilmente implementato come una routine microcodice interna. Questo microcodice è probabilmente programmato in linguaggio assembly, ma non penso sia visibile alla normale programmazione della calcolatrice al livello che hai descritto.

Come altri hanno descritto, il linguaggio assembly solitamente si trova in una corrispondenza molto stretta (se non 1: 1) con le funzionalità della macchina sottostante. Direi che la programmazione in linguaggio assembly include le seguenti caratteristiche che probabilmente non sono presenti nella programmazione di questo calcolatore.

  • Le operazioni includono operazioni di livello inferiore come AND bit, OR, XOR, spostamento; intero e (forse) aritmetico in virgola mobile, su una varietà di dimensioni dei dati (ad esempio precisione singola o doppia); caricare / memorizzare una varietà di dimensioni (byte, halfword, word, ecc.).

  • Le operazioni di livello più alto (trig, logarithms) sono in genere chiamate subroutine, non istruzioni. Ci sono alcune eccezioni, come il VAX DEC che aveva un'istruzione di valutazione polinomiale. [Modifica: OP ha sottolineato che x87 ha anche funzioni trigonometriche.]

  • Lo schema di indirizzamento della macchina è esposto. Se lo spazio degli indirizzi è segmentato, devi caricare un indirizzo di base in un registro e quindi indirizzare il codice oi dati relativi a quel registro. Anche con uno spazio di indirizzi piatto, sei a conoscenza degli indirizzi e dell'aritmetica degli indirizzi. Di solito gli assemblatori consentiranno ai programmatori di usare etichette per indicare gli indirizzi. Ma se un indirizzo si trova in un segmento diverso, potresti dover caricare un registro segmenti 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 i dati numerici in esadecimale, ottale, decimale, virgola mobile e occasionalmente dati di carattere.

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

  • Le convenzioni di chiamata di subroutine sono esposte. Argomenti e valori di ritorno possono essere passati in registri, o spinti a e spuntati da una pila. (Questa pila di solito è una regione di memoria indirizzata da uno speciale registro puntatore stack, non un set fisso come X Y Z e T.)

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

Il mio ricordo della programmazione di assemblaggi è che è molto, molto doloroso. Penso che programmare questo calcolatore sia facile e divertente al confronto. (Sorry.)

    
risposta data 13.07.2012 - 04:11
fonte
25

Sì, mi sembra decisamente un linguaggio assembly.

È difficile dire se quell'assembly sia proprio dalla descrizione, perché la definizione - una lingua i cui comandi mappano 1: 1 con il codice macchina della piattaforma di destinazione - è difficile determinare senza la conoscenza del codice macchina stesso, ma suona come il modo in cui ASM funziona su altre piattaforme.

    
risposta data 13.07.2012 - 00:14
fonte
11

Certamente ha alcune strette similitudini con un linguaggio assembly, ma ho intenzione di sostenere che non è quello che realmente è.

In un linguaggio assembly, le operazioni in gran parte mappano le istruzioni da 1 a 1 alle CPU. Ci sono alcune eccezioni, come macro e pseudo-ops (come, ad esempio, un'istruzione CLEAR che in realtà XOR registra con se stessa); 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 comportamento ).

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

Invece, sono sicuro che molte o la maggior parte delle operazioni visibili sono fatte come chiamate di subroutine. E per ogni operazione eseguita, ci deve essere una quantità significativa di lavoro extra svolto 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:

Did I have a basic idea of assembly languages using this device?

è sì.

    
risposta data 13.07.2012 - 02:42
fonte
9

È vero, il frammento di codice pubblicato assomiglia alla lingua assembly . La corretta conversione di questo codice definirà la versione.

Modifica: ha una lingua specifica per questo dispositivo, ma non è un assembly.

Sembra anche un calcolatore fatto dall'URSS. Funziona con batterie / cavo arrotondati?

    
risposta data 13.07.2012 - 00:47
fonte
3

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

Penso che un semplice test sia un'operazione di addizione su un numero in virgola mobile e un intero. La maggior parte dei linguaggi di programmazione di livello superiore accetta ADD 2,5, 7 e restituisce 9.5. I linguaggi di assemblaggio differiscono tuttavia l'output in base all'istruzione chiamata e in base alla rappresentazione del numero sottostante in binario. La maggior parte dei linguaggi di assemblaggio richiede un'istruzione diversa da utilizzare in base all'utilizzo di operazioni in virgola mobile vs integer. Un'eccezione a questa potrebbe essere una sorta di formato a virgola fissa.

    
risposta data 13.07.2012 - 04:35
fonte
3
Le calcolatrici

notazione polacca inversa (RPN) erano classiche. No, anche se le denominazioni del registro sembrano un linguaggio di assemblaggio, non lo era. I calcoli sono stati eseguiti traducendo dal formato algebrico sullo stack. I numeri utilizzati sono stati inseriti nello stack e le operazioni sono state eseguite all'ultimo impilato rispetto al penultimo valore 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 comprendi l'hardware dello stack e il linguaggio assembly questa calcolatrice è stata banale da apprendere in quanto il suo paradigma era molto simile.

    
risposta data 13.07.2012 - 16:52
fonte

Leggi altre domande sui tag