=====Sintassi intel, nasm, gas/at&t===== Esistono storicamente diverse sintassi per i processori Intel ====intel==== ...da fare ====nasm==== https://github.com/yasm/yasm/wiki/Nasmsyntax http://www.tortall.net/projects/yasm/manual/html/nasm.html - produce diversi formati: a.out, coff, elf32, elf64, win32 (16,32,64 bit), rdf - Netwide Assembler, possiede un disassemblatore: //ndisasm// - come MASM e TASM usa la sintassi Intel, priva di direttive, rimuovendo le ambiguità - se si vuole specificare un indirizzo della memoria lo si deve racchiudere tra //parentesi quadrate// altrimenti è considerata una costante. - una label è una pura costante numerica label: instruction operands ;comment ===== yasm ===== È un software compilatore assembler - permette di compilare usando **diversi** tipi di sintassi (non supporta la sintassi intel) - permette di compilare per **diverse** architetture hardware (x86, IA-32, AMD64) - permette di compilare in **diversi** formati binari: coff, elf32, elf64, macho32, win32 (16,32,64 bit) ====gas==== Per Linux si trova nel pacchetto //binutils// https://github.com/yasm/yasm/wiki/Gassyntax - GNU Assebler (spesso fornito insieme a //gcc//). - //gasp// è il programma preprocessore macro - Usa la sintassi AT&T come anche il compilatore //as// - questa sintassi può essere usata anche nei pogrammi in linguaggio C con gcc === Sintassi GNU AS, detta anche AT&T === http://en.wikipedia.org/wiki/MOV_%28x86_instruction%29 - il nome dei registri inizia con percentuale: %eax - il nome delle costanti inizia con il dollaro: $5 - il dollaro usato davanti ad una variabile indica il suo indirizzo: $var - le parentesi intorno al nome di una variabile indica il suo contenuto: (var) - una variabile senza dollaro indica il suo contenuto - il comando mov ha un suffisso che indica il numero di bit da utilizzare per la costante: - il comando //mov// si può usare con operandi di un byte (movb), due byte (movw), quattro byte (mowl) - Le operazioni con due operandi specificano prima la sorgente e dopo la destinazione: //movl $5,%eax// === direttive gas === - .intel_syntax - .code16 - .code32 - asm(".code16\n") - //gcc// compila a 32 bit, ma //gas// può cambiare modalità di indirizzamento ==== Macro ==== - GNU m4 (Beware that m4 may be dangerous for the health of compulsive programmers)