DOMANDA Studiare Assembly

Peri

Nuovo Utente
82
3
Salve!
Io ho studiato da poco il linguaggio C che ho appreso con grande facilità, ma una cosa che (strano a dirsi) non mi piaceva è che non mi faceva interagire a pieno con la macchina (come se io e il computer parlassimo ancora in due lingue diverse).
Il tutto è piuttosto metaforico OVVIAMENTE, è chiaro che il computer ragiona con il linguaggio macchina e forse fino a quel punto non ci arriverò. Ma mi interesserebbe studiare il linguaggio Assembly che (credo) mi garantirà una piena sintonia e controllo sul computer.
Vorrei avere da voi delle indicazioni su cosa posso fare per studiarlo e metterlo in pratica, al momento ho capito che sono importanti queste domande:
Come faccio a individuare l'architettura della mia CPU?
Come faccio a trovare online un manuale che mi spieghi come funziona tale architettura?
Cosa scaricare per far eseguire i codici che inserisco?
E dove posso imparare la sintassi?
E' chiaro che se ci sono altri quesiti o conoscenze da sapere sono lieto di conoscerle.
 
U

Utente cancellato 371741

Ospite
Io ho studiato da poco il linguaggio C che ho appreso con grande facilità
Mmm, il linguaggio C, a mio avviso, si impara bene in diversi anni.


non mi faceva interagire a pieno con la macchina
Infatti pare tu non lo conosca ancora a fondo.

L'assembly non e' un linguaggio portabile come il C, e' specifico da architettura a architettura. Devi decidere "quale assembly", per quale cpu. Poi, indifferentemente dall'architettura, esistono diverse sintassi, AT&T, intel, etc.

Immagino starai lavorando in quel cavolo di windows.
Comunque, in linux e gcc, prob anche in mingw, nbuttare giu un po di assembly da dentro il C e' molto semplice.

int main() { ... asm __volatile__ ( "bla bla" ); ... }

Per iniziale usa volatile. Inline assembly e' discorso comodo che funziona su gcc a partire da x86_64 fino ad avr-gcc e arduino 8 bit.

https://www.codeproject.com/Articles/15971/Using-Inline-Assembly-in-C-C

Altrimenti, sempre copn gcc, programmi assembly liscio da file programma.s o programma.S (che sono due cose leggermente differenti). Per mondo windows, hai svariati compilatori assembly per pc, nasm, tasm, masm32 e quant'altro. Segui le guide del compilatore specifico che scegli. Se studi meglio il C, puoi fare praticamente tutto in C, eccetto qualche operazione molto avanzata per cui puo capitare che serva l'assembly.


Saluti.
a
 
Ultima modifica da un moderatore:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Visto che bigendian ha portato un esempio sotto Linux, io lo porto sotto a Windows.

Vorrei avere da voi delle indicazioni su cosa posso fare per studiarlo e metterlo in pratica, al momento ho capito che sono importanti queste domande:
Come faccio a individuare l'architettura della mia CPU?

Se non hai software come Speccy installati sul PC (ma anche CPU-Z ad esempio), fai prima a cercare la CPU online.
Se è un PC degli ultimi, diciamo, 10 anni (e oltre) è molto probabile sia a 64bit (x64).

Come faccio a trovare online un manuale che mi spieghi come funziona tale architettura?

Su amazon trovi dei libri di testo già solo cercando per "linguaggio assembly". Si tratterà quasi sempre di risorse in lingua inglese comunque.
Una guida completa che trovi online è "the x86 assembly language" e la guida di ramsoft (in italiano).

Cosa scaricare per far eseguire i codici che inserisco?

Dipende da architettura e OS, come dice bigendian.
Io faccio riferimenti a Windows sempre: qui la vita è per certi versi più semplice, almeno in questo caso. Esiste l'assemblatore di Microsoft (MASM) che usa sintassi Intel, e che puoi utilizzare anche attraverso un IDE come Visual Studio.
In alternativa ti scarichi solo l'assemblatore ed utilizzi l'editor che preferisci (esiste anche un "MASM IDE").

Un esempio, il classico "Hello world":

Codice:
include     c:\masm32\include\masm32rt.inc

.data
dbHelloWorld   db     "Hello World!",13,10,0

.data?

.code
start:
    
    print offset dbHelloWorld
    inkey "Premi un tasto per continuare..."
    
    push 0
    call ExitProcess
    
end start

Codice:
// assemblaggio
ml /c /coff helloworld.asm

// linking
link /SUBSYSTEM:CONSOLE helloworld.obj

Output:
hello_world.png

Puoi utilizzarlo anche inline utilizzando C ma compilando con MSVC++ (compilatore di Microsoft); puoi anche con MinGw, ma non è proprio comodo come con MSVC++.
Un esempio anche qui (MSVC++, x86):

C:
#include <stdio.h>

int main() {
    int n, even = 0;
    
    scanf("%d", &n);
    
    _asm {
        mov   eax, [n]
        and   eax, 1
        mov   even, eax
    };
    
    printf("%d is even? %d", n, even);
    
    return 0;
}

Output:
odd_even.png

Chiaramente nessuno ti vieta di utilizzare ad esempio NASM.
Uno dei lati positivi di MASM, oltre al fatto di scriverlo più facilmente inline con MSVC, è che la lib che si porta dietro rende la vita più facile (con NASM a quanto ricordo non era affatto così).
Un esempio è quel "print" che vedi nel mio codice in asm sopra. Non è un'istruzione come MOV; in compilazione viene sostituita di fatto con una chiamata verso le API di Windows (evito inutili dettagli).

Se inizi ad esempio da 8086 e ti serve un emulatore hai l'imbarazzo della scelta. Se ti trovi su un OS Windows a 64 bit devi usare un emulatore per forza di cose, come DOSBox, DOSEmu, Emu8086..., se a 32bit invece no (in quanto esegue direttamente il codice a 16bit).

Comunque una delle possibili applicazioni dell'assembly, in aggiunta a quanto detto da bigendian, è in campi come ad esempio "malware analaysis" (saperlo leggere/capire, tra le tante altre cose richieste).
 
  • Mi piace
Reazioni: Peri e BrutPitt
U

Utente 16812

Ospite
Sarei curioso di sapere a quale tipo di "interazione" e a quale tipo di "controllo" sul sistema @Peri sta facendo riferimento e quali sono le funzioni che il codice Assembly dovrà assolvere ai fini di tale controllo ?
Mi chiedo anche se @Peri conosce già l'architettura di base del microprocessore e/o del microcontrollore per cui si andrà a scrivere il codice in Assembler perché altrimenti si rischia di parlare del nulla ?
 
U

Utente cancellato 371741

Ospite
Da Linux, essendo tutto open, hai il vantaggio di vedere tanto codice assembly funzionante, sian inline che plain asm, e per ogni architettura (vedi in /arch), cosa non da poco.


che sai che funziona per certo. Sintassi e' ovviamente at&t. E sempre da Linux, essendo open, vedi le casistiche in cui e' stato usato assembly e non C, come per certe specifiche operazioni.

Anche l'assembly tuttavia non si impara "pim-pum-pam", molti anni fa, ormai 30, scrissi un intero client email su windows, la curva d'apprendimento fu lunga qualche anno. E come per ogni cosa in informatica, spesso non si e' mai arrivati. Studiai dal vecchio "Linguaggio assembly avanzato" di Norton, e comprai turbo assembler 5 di cui ho ancora la scatola. Ricordo di aver letto alcune parti del libro anche 5 o 10 volte prima di capire.
 
Ultima modifica da un moderatore:
U

Utente cancellato 371741

Ospite
Ci sono interi OS scritti tutti in C o anche in C++ se non ricrodo male, tuttavia nei sorgenti troverai semrpe qualche minima parte in assembly, magari inline, per qualche specifica operazione come una sinicromnizzazione atomica, un "xchg" di uno spinlock che _non_ puoi fare in C. Ma si parla di cose minime e specifiche di chi sviluppa OS o lavora bare metal su microcontrollori.
 
U

Utente 16812

Ospite
Discutere di programmazione a basso livello senza conoscere l'hardware del microprocessore/microcontrollore è come parlare di motori senza sapere cosa sono i cicli termodinamici, i processi di combustione e la trasformazione dei gas perfetti ?
Si può dire tutto ma si parla a vuoto … ?
 
  • Mi piace
Reazioni: Moffetta88

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!