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


9

Stavo guardando il problema del progetto Euler 48 :

La serie, 1 1 + 2 2 + 3 3 + ... + 10 10 = 10405071317.

Trova le ultime dieci cifre della serie, 1 1 + 2 2 + 3 3 + ... + 1000 1000 .

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.

Dovrei fare alcuni di questi enigmi nell'assemblaggio per ottenere alcune informazioni sulla programmazione di basso livello e capire come funziona effettivamente il computer?


2
Se non sai come funziona la memoria, come puoi aspettarti di affrontare argomenti come i puntatori? Se non capisci come funziona un computer e un sistema operativo, come puoi programmare un'applicazione?
Ramhound,

Posso fare molte astrazioni Ramhound ecco perché ti ho chiesto questo. Potrei non riuscire ancora a far funzionare appieno i puntatori in qualche modo nei puntatori come lo scambio che ha senso logico una volta che si presume che i puntatori memorizzino la posizione della memoria di qualche altro tipo di dati. argomenti che dovrei leggere? Assembly Language e un po 'di COA sarebbero buoni?
Nishant,

Se non si ottiene il blocco completo dei puntatori, si scopre che questo è uno svantaggio grave in alcuni punti.
David Thornley,

3
O la tua linea Python calcola x ^ 2 per x in 1..1000 (invece di x ^ x per x in 1..1000) o python è ancora più magico di quanto pensassi. :)
Ingo,

La funzione "aumenta al potere di" *in Python?

Risposte:


1

Oltre all'apprendimento, credo che imparare come sia compilato un linguaggio di basso livello come C sia estremamente prezioso. Quindi la mia risposta è sì, ma di nuovo probabilmente sono di parte perché mi piace la programmazione di basso livello.

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

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

... diventa (almeno la parte interessante):

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 su func), lo sposta di 2 posizioni a sinistra (moltiplicandolo 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 una serie di cose di cui tenere conto, come le ottimizzazioni del compilatore. Invece di chiamare un'istruzione per moltiplicare direttamente per 5, sposta due posizioni 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 dell'assembler da gcc con l' -Sopzione. Tuttavia, tenere presente che i risultati variano in base al compilatore e al livello di ottimizzazione.

Ad ogni modo, non penso che essere un programmatore del linguaggio assembly sia uguale alla comprensione dell'assembly . Ancora una volta, sento che programmare in un linguaggio come C e sapere come viene inserito nel codice macchina è una pratica preziosa.


11

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

Vale la pena capirne alcuni, nel caso in cui si stia tentando di eseguire il debug di qualcosa senza sorgente.

MA vale sicuramente la pena capire la macchina almeno a livello di 'C' e puntatori (essenzialmente un assemblatore di alto livello) in modo da sapere perché concatenare una stringa un milione di volte in un ciclo è male.


In realtà, alcune implementazioni relativamente intelligenti non possono for i in range(1000000): s = s + '.'peggiorare (molto) le versioni "ottimizzate" del mio riutilizzo s. Allo stesso modo, molti altri sviluppi invalidano ciò che è ragionevole supporre con conoscenza C e presupponendo un'implementazione ingenua. Ma in generale è più utile che dannoso.

2
@delnan-Avevo solo bisogno di un breve esempio di dove qualcosa che sembra innocuo in Java / C # potrebbe essere molto costoso per il silicio. Ho incontrato in particolare molte persone che pensano che l'allocazione e la copia di memoria di grandi dimensioni sia immediata.
Martin Beckett,

Odio credere che Delnan :-)
Nishant,


1

Sì e no.

Mentre è vero che ti garantirà una migliore comprensione di ciò che sta facendo il tuo codice e perché alcune cose sono solo una cattiva idea, devi pensare allo sforzo.

L'apprendimento dell'assemblatore non è un progetto del fine settimana, ti richiederà molto tempo e devi pensare se questo tempo potrebbe essere speso meglio.

Se non sei nel codice ottimizzato, probabilmente non vedrai mai benefici pari allo sforzo che hai fatto.


1

Ho fatto molto assemblatore quando ero più giovane e non credo che abbia aiutato a capire qualcosa al di fuori dell'assemblatore. Se dai un'occhiata al moderno assemblatore è comunque tutto roba in linguaggio macro. Di solito odio le analogie, ma qui va comunque: sapere come funziona il motore di un'auto ti rende un guidatore migliore?


Sapere come funziona il motore di un'auto ti rende un guidatore migliore? No, ma ti rende un proprietario di auto migliore, perché se il motore si guasta puoi ripararlo.
Cameron Martin,

D'accordo, ma non ti rende un driver migliore, che è l'analogia che stavo usando. Riparando tu stesso il motore non stai supportando l'economia in generale impiegando la meccanica, ... Le analogie hanno dei limiti. Generalmente non scoraggerei mai qualcuno dal cercare di imparare qualcosa se sono interessati, ma penso che tu debba andare abbastanza in profondità nella tana del coniglio per poterlo applicare utilmente alle lingue di livello superiore. Per cominciare, è necessario comprendere le ottimizzazioni di compilazione utilizzate dal linguaggio specifico se è compilato, o l'interprete o il jitter. È una vasta area.
Ian

1

Il modo in cui ho lavorato per comprendere l'assemblatore è scrivere programmi in linguaggi di livello superiore, quindi sostituire parti con tratti (almeno si spera) funzionalmente equivalenti di codice assemblato. Questo significa che riesco a usare gli HLL per quello che sono buoni per l'organizzazione e la risoluzione di problemi di alto livello e uso l'asm per battere il metallo.

(Quando parlo del programma host 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).

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.