2016-06-29 32 views
5

Abbiamo avuto un compito, data era un'istruzione assembler di un 2-indirizzamento macchina:Cercare di capire questo breve istruzione assembler, ma non capisco

mov 202, 100[r1+] 

Annotare una sequenza di istruzioni minimo assembler che sostituisce questa istruzione (vedi sopra)

dove

  • n[rx+]: registro indicizzato per incremento post; n è il valore dell'indice e rx è registrarsi x

  • singolo valore numerico: rivolta direttamente/memorizzato

Gli indirizzi che siamo tenuti a utilizzare sono:

  1. rx - registrazione indirizzamento diretto
  2. [rx] - registrazione indirizzamento indiretto
  3. #n - direttamente addre ssing

E ci è consentito solo l'uso di add, sub, mov.

Io in particolare non capisco cosa significa # e perché abbiamo bisogno di una sottrazione, ma in realtà non capisco nulla ... L'attività è stata risolta quindi non sto cercando una soluzione. Ho bisogno di una spiegazione su come è stata fatta, cercando di capirlo da solo ma non ha funzionato. Spero che qualcuno possa aiutarmi, sarebbe così gentile da parte tua!

Soluzione:

add #100, r1 
mov #202, r2 
mov[r2],[r1] 
sub #99, r1 
+3

Un prefisso '#' indica una costante immediata in alcune lingue di assemblaggio. Sembra che sia quello che fa anche in questo. –

+3

Wy stai chiedendo al tuo istruttore di spiegare? Vengono pagati per fornirti le conoscenze e la comprensione necessarie e apparentemente non hanno ancora guadagnato la paga. (Non downvoting - solo chiedendo.) –

risposta

6

Comprendere che il linguaggio assembly non è una cosa standardizzata universale. È ufficialmente definito dal programma che lo legge che è l'assemblatore. Quindi qualunque sia il codice che definisce la lingua per quell'assemblatore è la lingua. Il codice macchina è ciò che conta per il processore, in modo che tu possa avere il numero di assemblatori e linguaggi di assemblaggio diversi da quelli degli utenti, purché tutti producano il codice macchina corretto. Quindi se ti aspetti che questo sia universale, una regola si applica a tutti i tipi di cose che non è il caso.

Hai fornito abbastanza informazioni per consentire a persone esperte di vedere le abitudini degli altri linguaggi di assemblaggio riflesse qui.

mov 202, 100[r1+] 

Quindi questo sembra muoversi ciò che è in indirizzo del registro 202 indirizzamento diretto come avete dichiarato. alla posizione all'indirizzo r1 + 100 registro indicizzato e l'incremento post.

Per sostituire quello con più istruzioni poiché la riga è la più semplice per quanto riguarda le righe di codice (per quanto la complessità e il numero di orologi non necessariamente).

  • Quindi è necessario leggere il contenuto di indirizzo 202,
  • è necessario aggiungere 100 a r1 temporanea,
  • è necessario scrivere i contenuti di indirizzo 202 alla posizione R1 + 100,
  • e quindi è necessario prendere r1 e incrementarlo (non r1 + 100 incrementato ma r1 senza l'indice incrementato).

La soluzione data praticamente fa che:

add #100, r1 
mov #202, r2 
mov[r2],[r1] 
sub #99, r1 

Si aggiunge 100 a r1, che abbiamo bisogno di fare temporaneamente (e dovremo annullare più tardi perché r1 è ora di sbagliato nel lungo periodo). Quindi, poiché limitano le modalità di indirizzamento, è necessario avere un registro per contenere l'indirizzo 202, quindi il valore 202 viene caricato in r2 proprio come il valore 100 è stato aggiunto a r1. Il numero # significa semplicemente usare questo numero.

Ora è possibile utilizzare [rn] in modo che lo spostamento legga ciò che è all'indirizzo r2 (indirizzo 202) e lo scriva in corrispondenza dell'indirizzo r1 (l'originale r1 più 100).Infine perché vogliamo r1 di finire per essere il più originale 1, ma ce l'abbiamo fatta l'originale più 100 dobbiamo sottrarre fuori 99 r1 + 100-99 = r1 + 1


In C, sarebbe qualcosa in questo modo:

unsigned *r1; 
unsigned *r2; 

//r1 is set somewhere in here to something that is not defined in your question or problem. 

r1 += 100; //add #100,r1 
r2 = 202; //mov #202,r2 
*r1 = *r2; //mov [r2],[r1] 
r1 -= 99; //sub #99,r1 

avente la destinazione sulla destra e operando a sinistra non è intuitivo dato che la maggior parte scrivere e codice con il risultato sulla sinistra e gli operandi a destra.

non lo facciamo codice 202 = r2; abbiamo invece scriviamo r2 = 202; così mov r2,#202 è più intuitivo, ma ancora una volta il montaggio linguaggio è definito dalle le persone che hanno scritto l'assemblatore e alcune persone piace sinistra a destra e da destra a sinistra gli altri.

+0

Grazie mille per il tempo che trascorri, davvero grazie per aver scritto tutto questo per me. Speravo di avere delle risposte quando tornerò online la sera prossima ed è semplicemente fantastico! Non lo capisco completamente di sicuro, ma sicuramente ho capito l'idea di base e ora dovrei essere in grado di migliorarlo da questo punto. ;) –

+0

a parte questa sembra essere la soluzione più corta. se si evitasse la sottrazione di 99 usando un terzo registro, penso che occorra più istruzioni almeno con quello che sappiamo di questo set di istruzioni dalla descrizione. –

+1

romperlo nelle sue singole parti. alcuni numeri sono solo numeri interi/immediati, il registro contiene un numero e quel numero può in determinati modi essere un indirizzo o solo un valore. quindi rompere le istruzioni in quelle parti. Ho un numero è un indirizzo base, aggiungo un altro numero ad esso che è l'indirizzo in memoria. quell'indirizzo in memoria contiene un numero e così via. –

-2

soluzione Lei non mappa all'ingresso a tutti. Nel tuo input, R1 si trova in uno stato sconosciuto. Nella nostra "soluzione" R1 finisce in uno stato noto (1).

Inoltre, dovresti sapere qual è il tuo formato di istruzione nazionale.

mov 202, 100[r1+] 

sembra che sarebbe

1) add 100 to the contents of R1 to create an address. 
2) move 202 into that address 
3) Add 2 to r1 (assuming a 2-byte machine word) 
+0

Grazie mille per la risposta. Poiché è la soluzione fornita dal nostro professore, non sono sicuro di cosa pensare ora: D –

+1

Il tuo primo paragrafo è sbagliato. @ cnmesr's 'mov [r2], [r1]' è una copia dalla memoria alla memoria e non modifica alcun registro. Il risultato netto del codice è 'r1 + = 1', apparentemente uguale a '100 [r1 +]'. –

3

In mov 202, 100[r1+]:

  • L'istruzione è un operando mov
  • La fonte è la memoria all'indirizzo 202. In alcune lingue di assemblaggio, è anche possibile scrivere [202] per chiarezza. Non c'è # sul numero, quindi è una modalità di indirizzamento assoluta, non immediata.
  • L'operando di destinazione è la memoria all'indirizzo r1 + 100.
  • L'effetto collaterale del modo di indirizzamento è r1++

Come molti sapori di linguaggio assembly, questo usa apparentemente # prefissi per indicare le costanti immediati. È simile alla sintassi T x86 GNU/AT &, dove add $4, %eax aggiunge 4, ma add 4, %eax carica un valore dall'indirizzo assoluto 4.


data sequenza equivalente del tuo professore aggiunge 100 a r1, quindi sottrae 99, dal momento che vuole evitare spostamenti e post-incrementi nell'affrontare modalità. Clobbers anche r2, che la versione single-instruction non fa, quindi non è una sostituzione drop-in.

+0

Perché il downvote? –

+2

@MargaretBloom: Penso che qualcuno sia arrivato e abbia odiato la domanda così tanto da voler penalizzare le persone anche solo per aver risposto e incoraggiare altre domande come questa. Il downvote su questa risposta è apparso nello stesso momento di un downvote sulla domanda e altre risposte. –

+3

Anche la domanda è stata downvoted: /. IMO questa è una domanda molto giusta e ragionevole, con gli sforzi passivi e futuri ragionevoli mostrati dall'OP, vale la pena di queste risposte. Mi aiuta anche a vedere su cosa lotta la gente (una volta che hai fatto un codice ASM, è un po 'sfuggente capire i problemi dei nuovi arrivati), così posso aiutarli la prossima volta in modo più preciso e facile. Semplicemente non mi piace la loro variante ASM, non specificando la larghezza dei dati degli operandi - quindi non è chiaro quale quantità di dati viene spostata, sarebbe stato più istruttivo con opzionale b/w/d e '+' essendo sensibile alla dimensione dei dati. – Ped7g