Dovrei provare a fare problemi di pratica in assemblea? [chiuso]

9

Stavo guardando Project Euler Problem 48 :

The series, 11 + 22 + 33 + ... + 1010 = 10405071317.

Find the last ten digits of the series, 11 + 22 + 33 + ... + 10001000.

In Python posso farlo con una sola riga:

sum((x**x for x in xrange(1,1001))

Ma l'equivalente di assemblaggio di questo sarebbe 100 linee e una vera sfida.

Devo eseguire alcuni di questi enigmi in assemblea per ottenere informazioni sulla programmazione di basso livello e capire come funziona effettivamente il computer?

    
posta Nishant 11.04.2011 - 17:24
fonte

6 risposte

1

Oltre l'assemblaggio dell'apprendimento, credo che l'apprendimento di come viene redatto un linguaggio di basso livello come C è molto prezioso. Quindi la mia risposta è sì, ma poi di nuovo sono probabilmente di parte perché mi piace la programmazione di basso livello.

Ad esempio, basta capire come vengono compilate semplici istruzioni. La seguente funzione,

int func(int val)
{
  int num = val * 5;
  return num;
}

... diventa (il bit interessante almeno):

movl    %edi, -20(%rbp)
movl    -20(%rbp), %edx
movl    %edx, %eax
sall    $2, %eax
addl    %edx, %eax

Questo codice prende l'argomento dallo stack (val, il parametro da func), lo sposta di 2 posizioni (moltiplicato per 2 ^ 2 o 4) e quindi aggiunge il valore originale al risultato. Il risultato finale è una moltiplicazione per 5. Un esempio come questo illustra un numero di cose da tenere presente, come le ottimizzazioni del compilatore. Invece di chiamare un'istruzione per moltiplicare direttamente per 5, sposta due punti per moltiplicare per 4 e quindi aggiunge il valore originale. Ho trovato esempi come questo per migliorare notevolmente la mia comprensione delle cose a un livello inferiore.

Genera l'output assembler da gcc con l'opzione -S . Tuttavia, tieni presente che i risultati variano a seconda del compilatore e del livello di ottimizzazione.

In ogni caso, non credo che essere un programmatore di linguaggio assembly sia lo stesso di capire l'assembly . Di nuovo, sento che programmare in un linguaggio come C e sapere come viene inserito nel codice macchina è una pratica preziosa.

    
risposta data 12.04.2011 - 16:40
fonte
11

Probabilmente non è necessario essere effettivamente in grado di scrivere un assemblatore (la maggior parte dei quali è dettagli della convenzione di inizializzazione e chiamata per il tuo sistema).

Vale la pena comprenderne alcuni, nel caso si stia tentando di eseguire il debug di qualcosa senza fonte.

MA vale sicuramente la pena di capire la macchina almeno a livello di "C" e puntatori (essenzialmente un assemblatore di alto livello) in modo che tu sappia perché conciliare una stringa un milione di volte in un ciclo è brutto.

    
risposta data 11.04.2011 - 17:38
fonte
5

Buona domanda. Learning Assembly è decisamente buono e vale la pena.

  1. Tale comprensione a basso livello sarà di grande utilità nello sviluppo di software embedded
  2. Refactoring a basso livello
  3. Ti aiuterà a utilizzare efficacemente il debugger
  4. Fornisci una comprensione del codice smontato per aiutare in cose come code caves
risposta data 11.04.2011 - 17:39
fonte
1

Sì e no.

Anche se è vero che ti permetterà di capire meglio cosa sta facendo il tuo codice e perché alcune cose sono solo una cattiva idea, devi pensare allo sforzo.

L'assemblatore di apprendimento non è un progetto del fine settimana, ti richiederà molto tempo e dovrai pensare se questa volta potrebbe essere meglio spesa.

Se non sei in codice ottimizzato, probabilmente non vedrai mai benefici pari allo sforzo che fai.

    
risposta data 12.04.2011 - 15:52
fonte
1

Ho fatto un sacco di montaggio quando ero più giovane e non penso che abbia aiutato a capire qualcosa al di fuori dell'assembler. Se date un'occhiata all'assemblatore moderno è comunque tutto roba in linguaggio macro. Di solito odio le analogie, ma qui va comunque: sapere come funziona il motore di una macchina ti rende un pilota migliore?

    
risposta data 12.04.2011 - 16:05
fonte
1

Il modo in cui ho lavorato per capire l'assemblatore è scrivere programmi in linguaggi di livello superiore, quindi sostituire parti con (almeno spero) tratti funzionalmente equivalenti di codice assemblato. Ciò significa che posso utilizzare gli HLL per quello che sono utili per organizzare e risolvere problemi di alto livello e io uso asm per battere il metallo.

(Quando parlo del programma host che viene scritto in un HLL, intendo C o ObjC quando sto cercando di imparare x86_64 asm e BASIC quando sto lavorando su Z80, 6502 e 6809 asm).

    
risposta data 28.08.2011 - 22:21
fonte

Leggi altre domande sui tag