View Full Version : [assembly x86 moderno] quali tools?
ciao sto utilizzando il libro "art of assembly x86" , che dicono sia una vera bibbia ,ma noto che gli esempi sono scritti per masm versione dos :
ho scaricato masm32 e non riesco a compilarne uno!
non è obsoleto usare dosbox con masm oggi per scrivere programmi moderni in assembly ?
quali ide e tools usate voi per farlo ( sia per win che per linux) ?
pabloski
24-07-2015, 09:16
è il libro di Randall Hyde? considera che è disponibile in 3 versioni, di cui una DOS che va considerata obsoleta
ad ogni modo, sotto linux hai nasm, yasm, fasm e gas
l'ultimo supporta la sintassi AT&T oltre a quella Intel, ad alcuni piace ad altri no, questione di gusti
il punto è trovare una buona guida per l'assembly moderno ( probabilmente a te non compilano perchè sono in assembly a 16 bit )
ti consiglio di iniziare con "Programming from the Ground Up" di Bartlett, perchè è un libro molto pratico, con esempi compilabili su Linux 32 bit
il problema è che gli altri se ne vanno a spasso con la teoria e dimenticano di parlare di aspetti pratici, col risultato di ritrovarti a scrivere un codice assembly che l'assemblatore non vuole saperne di assemblare
è il libro di Randall Hyde? considera che è disponibile in 3 versioni, di cui una DOS che va considerata obsoleta
ad ogni modo, sotto linux hai nasm, yasm, fasm e gas
l'ultimo supporta la sintassi AT&T oltre a quella Intel, ad alcuni piace ad altri no, questione di gusti
il punto è trovare una buona guida per l'assembly moderno ( probabilmente a te non compilano perchè sono in assembly a 16 bit )
ti consiglio di iniziare con "Programming from the Ground Up" di Bartlett, perchè è un libro molto pratico, con esempi compilabili su Linux 32 bit
il problema è che gli altri se ne vanno a spasso con la teoria e dimenticano di parlare di aspetti pratici, col risultato di ritrovarti a scrivere un codice assembly che l'assemblatore non vuole saperne di assemblare
ciao , c'è troppa dispersione di energie : conosci il manuale di irvine Assembly Language for x86 Processors ? non ho gradito che l'autore abbia implicitamente obbligato ad usare subito le sue librerie
tomminno
24-07-2015, 09:38
Programmi interamente scritti in assembly per X86 dubito che possano definirsi "moderni".
Ad oggi l'assembly in ambito X86 si usa per particolari routine che sfruttano le estensioni dei processori per cui l'ottimizzazione del compilatore è scarsa. Per il resto non ha assolutamente senso usarlo (in ambito X86).
pabloski
24-07-2015, 10:14
ciao , c'è troppa dispersione di energie : conosci il manuale di irvine Assembly Language for x86 Processors ? non ho gradito che l'autore abbia implicitamente obbligato ad usare subito le sue librerie
si l'ho letto ed è un ottimo libro
ti avevo consigliato l'altro perchè è rapido, pratico, sbrigativo e focalizzato su linux
comunque il libero di Irvine scrive gli esempi in assembly 32 bit, per cui sono di fatto usabili su qualunque sistema a 32 bit
occhio che a livello di assembly ci sono sempre differenze dovute all'architettura, per cui non riuscirai mai a far girare un programma a 32 bit su un sistema operativo a 64 bit ( a meno di fare le dovute modifiche, principalmente alle operazioni di push e pop )
si l'ho letto ed è un ottimo libro
ti avevo consigliato l'altro perchè è rapido, pratico, sbrigativo e focalizzato su linux
comunque il libero di Irvine scrive gli esempi in assembly 32 bit, per cui sono di fatto usabili su qualunque sistema a 32 bit
occhio che a livello di assembly ci sono sempre differenze dovute all'architettura, per cui non riuscirai mai a far girare un programma a 32 bit su un sistema operativo a 64 bit ( a meno di fare le dovute modifiche, principalmente alle operazioni di push e pop )
tecnicamente però dovrei poter far girare programmi a 32bit su un windows in esecuzione come macchina virtuale virtualbox no ? chiedo perchè anche gli esempi di irvine non compilano :muro:
scusate , ma a cosa mi serve scrivere del codice dipendente dalle sue librerie ?
è il libro di Randall Hyde? considera che è disponibile in 3 versioni, di cui una DOS che va considerata obsoleta
ad ogni modo, sotto linux hai nasm, yasm, fasm e gas
l'ultimo supporta la sintassi AT&T oltre a quella Intel, ad alcuni piace ad altri no, questione di gusti
il punto è trovare una buona guida per l'assembly moderno ( probabilmente a te non compilano perchè sono in assembly a 16 bit )
ti consiglio di iniziare con "Programming from the Ground Up" di Bartlett, perchè è un libro molto pratico, con esempi compilabili su Linux 32 bit
il problema è che gli altri se ne vanno a spasso con la teoria e dimenticano di parlare di aspetti pratici, col risultato di ritrovarti a scrivere un codice assembly che l'assemblatore non vuole saperne di assemblare
una domanda : cosa cambia tra gli esempi di irvine e quelli di questo libro?
pabloski
24-07-2015, 11:48
tecnicamente però dovrei poter far girare programmi a 32bit su un windows in esecuzione come macchina virtuale virtualbox no ? chiedo perchè anche gli esempi di irvine non compilano :muro:
scusate , ma a cosa mi serve scrivere del codice dipendente dalle sue librerie ?
il discorso delle virtual machine è un pò particolare, nel senso che virtualbox ti permette di far girare un sistema host in modalità a 32 bit su un sistema host a 64 bit
per cui nella VM sarà effettivamente tutto a 32 bit
riguardo i problemi di compilazione, beh, bisognerebbe vedere il codice, magari ci sono delle cose che l'assembler non supporta
le librerie di Irvine sono dei file .inc, per cui vengono inclusi i sorgenti nei tuoi file
una domanda : cosa cambia tra gli esempi di irvine e quelli di questo libro?
il libro che ti ho consigliato è specificamente pensato per programmare in assembly sotto linux con l'assemblatore Gas, per cui se li compili sei sicuro che vanno
l'unico intoppo si verifica quando si cerca di assemblare quei programmi su linux a 64 bit
ciao non capisco una cosa : cosa cambia tra assembly linux e assembly dos(o windows) ?
in fin dei conti la cpu è la stessa !
sto facendo un po di confusione : a me non interessa lo stile hal con if , while ect , ma
di imparare a scrivere codice a bassissimo livello
pabloski
24-07-2015, 14:26
ciao non capisco una cosa : cosa cambia tra assembly linux e assembly dos(o windows) ?
Due cose:
1. l'ABI
2. le syscall
e ci sarebbero anche gli strumenti di default, ma nessuno ti può impedire di usare FASM su linux e windows
alcuni tendono a differenziare anche in base ai formati dei file eseguibili, ma questo non è un dettaglio che riguarda l'assemblatore e il programmatore
c'è inoltre da considerare il fatto che storicamente su linux si usava la sintassi AT&T e l'assemblatore GAS, mentre su windows si preferiva Masm e la sintassi Intel
il problema nasce perchè ogni assemblatore offre delle funzionalità aggiuntive e delle keyword per definire alcuni parametri ( ad esempio il modello di memoria da usare )
per cui è necessario focalizzarsi su due aspetti: le keywords e le funzionalità fornite dall'assemblatore ( si trovano nei relativi manuali ) e l'ISA della cpu ( la trovi nei manuali Intel/AMD ed è sostanzialmente l'elemento comune a tutti gli assemblatori )
di imparare a scrivere codice a bassissimo livello
purtroppo è uno degli errori che imho fanno gli autori dei libri, ovvero cercare di rendere l'assembly qualcosa di alto livello
comunque il libro che ti ho consigliato è ottimo se questo è il tuo scopo
zero fronzoli, ti parla di com'è fatta l'ABI linux ( stack frame, convenzioni delle chiamate ) e delle syscall specifiche per linux
tomminno
24-07-2015, 14:32
ciao non capisco una cosa : cosa cambia tra assembly linux e assembly dos(o windows) ?
in fin dei conti la cpu è la stessa !
sto facendo un po di confusione : a me non interessa lo stile hal con if , while ect , ma
di imparare a scrivere codice a bassissimo livello
Il tuo programma gira all'interno di un sistema operativo e con quello deve fare i conti.
Anche solo per caricare in memoria un oggetto o leggere e scrivere sulla console devi usare le api o le convenzioni del sistema operativo.
ciao , scusate , ma in materia sono ignorante : è possibile scrivere con l'assembly di linux delle routine piccole di prova da lanciare in una sistema senza Os ?
le routine di assembly scritte dal prof Tanenbaum in minix a quale tipo di assembly appartengono?
voglio dire : lui ha scritto delle routine in assembly per minix , ipotizzando che nel pc non ci sia installato nessun Os!
pabloski
24-07-2015, 18:34
ciao , scusate , ma in materia sono ignorante : è possibile scrivere con l'assembly di linux delle routine piccole di prova da lanciare in una sistema senza Os ?
dipende da cosa intendi con quel termine
se ti riferisci all'uso di linux per scrivere ed assemblare il programma, allora non vedo che problema ci dovrebbe essere
se invece intendi che il programma assembly è scritto per linux ( cioè usa le syscall di linux ) allora non funzionerà mai
gli elementi essenziali di un programma bare-metal ( si chiamano così i programmi senza OS )
1. il programma non deve usare niente di tutto ciò che il sistema operativo che stai usando offre ( syscall, libc, varie ed eventuali )
2. il programma dev'essere un binario puro, senza nessun formato
in sintesi puoi farlo con l'assembly ma anche con il C, basta usare le opzioni giuste quando vai a compilare
esempio banalissimo http://flatassembler.net/docs.php?article=manual#1.1.4
"By default, when there is no format directive in source file, flat assembler simply puts generated instruction codes into output, creating this way flat binary file. By default it generates 16-bit code, but you can always turn it into the 16-bit or 32-bit mode by using use16 or use32 directive"
in pratica metti la keyword format nel tuo file sorgente e specifichi che tipo di eseguibile vuoi che produca
gli eseguibili che servono a te sono i flat binary
le routine di assembly scritte dal prof Tanenbaum in minix a quale tipo di assembly appartengono?
minix gira su arm e x86 e quelle routine sono scritte in assembly AT&T e compilate tramite Gas
è una sua scelta, non sei obbligato a seguirla
voglio dire : lui ha scritto delle routine in assembly per minix , ipotizzando che nel pc non ci sia installato nessun Os!
si, ma routine simili le trovi in linux, freebsd, windows, ecc....
in sostanza sei tu, il tuo programma e il processore
la cosa fondamentale da capire è che non c'è niente di speciale in un programma del genere, semplicemente le istruzioni sono una sfilza di byte a cui il processore dà uno specifico significato
in un altro contesto potrebbero benissimo essere considerati dati invece che istruzioni
se ti scarichi il manuale intel del set d'istruzioni x86, noterai che sono specificati i codici mnemonici ( MOV, INT, ecc... ) e le corrispondenti stringhe di bit che li rappresentano
la cpu vede solo le stringhe di bit
la cosa fondamentale da capire è che non c'è niente di speciale in un programma del genere, semplicemente le istruzioni sono una sfilza di byte a cui il processore dà uno specifico significato
ciao però quello dovrebbe essere assembly puro no?
come faccio a usare ad esempio una syscall del kernel linux (come la exit) se non c'è nessun Os installato nel pc?
un conto è usare pure istruzioni x86 , un conto è usare anche istruzioni o direttive specifiche per msDos o Linux?
ho capito bene? spero di essermi spiegato altrettanto bene
pabloski
24-07-2015, 19:03
ciao però quello dovrebbe essere assembly puro no?
momento
per assembly s'intende la rappresentazione mnemonica del linguaggio macchina, quest'ultimo è una sfilza di bytes
come faccio a usare ad esempio una syscall del kernel linux (come la exit) se non c'è nessun Os installato nel pc?
non puoi, perchè non stai facendo girare il kernel che la implementa
se vuoi la exit devi riscrivertela
un conto è usare pure istruzioni x86 , un conto è usare anche istruzioni o direttive specifiche per msDos o Linux?
non esistono istruzioni assembly/macchina specifiche per un sistema operativo
il SO pone solo 3 restrizioni alla libertà dell'assembly:
1. formato dei file eseguibili
2. ABI
3. chiamate di sistema ( syscall )
l'assembly non è in alcun modo legato al sistema operativo, è semplicemente la rappresentazione del set d'istruzioni del processore
quando vai a creare un programma assembly per linux, usi le stesse identiche istruzioni che usi in un programma bare-metal
l'unica differenza è che ad un certo punto vedrai delle istruzioni tipo INT 80 o SYSENTER che servono per chiamare le syscall del sistema operativo
quindi:
1. il linguaggio macchina è lo stesso
2. l'assembly è ovviamente lo stesso
3. i vari assemblatori aggiungono delle cose loro ( che non fanno però parte del linguaggio assembly ) per facilitare il programmatore
4. il sistema operativo aggiunge delle sue funzioni chiamate syscall, utilizzabili dai programmi utente
grazie mille ora mi è tutto più chiaro :)
cdimauro
25-07-2015, 07:09
l'ultimo supporta la sintassi AT&T oltre a quella Intel, ad alcuni piace ad altri no, questione di gusti
Diciamo che una macchina gradisce la prima, mentre un essere umano di più la seconda. :D
Ad oggi l'assembly in ambito X86 si usa per particolari routine che sfruttano le estensioni dei processori per cui l'ottimizzazione del compilatore è scarsa. Per il resto non ha assolutamente senso usarlo (in ambito X86).
In realtà per le nuove istruzioni si preferiscono gli intrinsic, anche se francamente preferirei scrivere qualche istruzione assembly anziché quell'ammasso di roba in C/C++.
Comunque è possibile ancora oggi realizzare cose con l'assembly che un compilatore può soltanto sognarsi. Il problema è che non è facile integrare queste parti con il resto. Ovviamente è una cosa che ha senso fare soltanto se ne vale realmente la pena (se, nell'insieme, c'è un netto guadagno di prestazioni).
occhio che a livello di assembly ci sono sempre differenze dovute all'architettura, per cui non riuscirai mai a far girare un programma a 32 bit su un sistema operativo a 64 bit ( a meno di fare le dovute modifiche, principalmente alle operazioni di push e pop )
Assolutamente no: i programmi a 32 bit generalmente girano senza problemi su un s.o. a 64 bit.
Il problema che riporti è diverso, e riguarda l'adattamento di un programma assembly da 32 a 64 bit. Lì ovviamente servono modifiche al codice perché alcuni registri oppure operazioni sono a 64 bit di default, anziché a 32, per cui è facile che possano sorgere dei problemi (PUSH e POP, ma anche CALL, RET, e in generale la struttura dello stack per il passaggio dei parametri o la definizione delle variabili locali).
sto facendo un po di confusione : a me non interessa lo stile hal con if , while ect , ma
di imparare a scrivere codice a bassissimo livello
Lo puoi fare e lo fai benissimo anche con un linguaggio assembly "high level", che è nato per semplificare la vita ai programmatori, senza togliere il contatto intimo con la macchina che ti sta a cuore.
purtroppo è uno degli errori che imho fanno gli autori dei libri, ovvero cercare di rendere l'assembly qualcosa di alto livello
L'errore, invece, è quello di non comprendere le finalità di uno strumento.
ciao però quello dovrebbe essere assembly puro no?
come faccio a usare ad esempio una syscall del kernel linux (come la exit) se non c'è nessun Os installato nel pc?
un conto è usare pure istruzioni x86 , un conto è usare anche istruzioni o direttive specifiche per msDos o Linux?
ho capito bene? spero di essermi spiegato altrettanto bene
http://wiki.osdev.org/Main_Page
una domanda : i driver per le periferiche sono scritti in assembler?
ogni periferica ha il suo assembler ?
oppure sono in c ?
se così fosse come fa il programmatore a ottimizzarli?
altra domanda : in che modo in linux posso fare bios programming ?
pabloski
30-07-2015, 09:43
una domanda : i driver per le periferiche sono scritti in assembler?
non necessariamente e praticamente mai al 100%
ogni periferica ha il suo assembler ?
dipende da cosa intendi
il driver "gira sulla cpu" e quindi è scritto nel linguaggio macchina della cpu
ma le periferiche hanno dei controller dentro, dei veri e propri computer, e questi qui non usano praticamente mai normali cpu, ma quasi sempre processori arm, mips, avr, ecc...
se così fosse come fa il programmatore a ottimizzarli?
esistono tanti tipi di ottimizzazioni, mica solo quella riguardante l'ottenimento delle massime prestazioni dalla cpu
altra domanda : in che modo in linux posso fare bios programming ?
spero non ti stia riferendo alla creazione di un BIOS
se invece ti riferisci all'uso dei servizi del BIOS, sappi che non sono disponibili in modalità protetta ( quella usata dai sistemi operativi moderni )
ci sarebbero degli escamotage, ma sono utilizzabili solo dal software che gira in modalità supervisore, cioè dal kernel
no , intedevo solo bios programming : Irvine nel suo libro ci dedica ben un capitolo per cui presumo sia qualcosa di importante
pabloski
30-07-2015, 12:08
no , intedevo solo bios programming : Irvine nel suo libro ci dedica ben un capitolo per cui presumo sia qualcosa di importante
Si tratta di programmazione in real-mode, appoggiandosi alle funzioni offerte dal BIOS. Quelle funzioni vengono usate anche dai sistemi operativi moderni, ma solo nelle primissime fasi del bootstrap. Dopo di che il controllo passa al sistema operativo e ai suoi driver.
Se vuoi programmare in quel modo, ti conviene procurarti una copia del DOS e installare quello. O magari puoi farlo tramite virtual machine.
cdimauro
30-07-2015, 20:51
il driver "gira sulla cpu" e quindi è scritto nel linguaggio macchina della cpu
E' compilato in binario eseguibile dalla CPU, ma generalmente il driver è scritto in C/C++, con quale pezzo di assembly se dovesse servire.
se invece ti riferisci all'uso dei servizi del BIOS, sappi che non sono disponibili in modalità protetta ( quella usata dai sistemi operativi moderni )
Non sono disponibili tutti i servizi (API), ma un po' di roba per la modalità protetta c'è.
ci sarebbero degli escamotage, ma sono utilizzabili solo dal software che gira in modalità supervisore, cioè dal kernel
Dipende da cosa consente di fare il s.o.. Potrebbe permettere la programmazione dell'hardware anche in user mode, oppure sfruttando la modalità VM8086 (in maniera controllata).
no , intedevo solo bios programming : Irvine nel suo libro ci dedica ben un capitolo per cui presumo sia qualcosa di importante
Solo se devi sviluppare s.o. oppure software che bypassa completamente il s.o..
Comunque t'avevo già riportato un sito dedicato appositamente allo scopo, ma al momento non penso che tu abbia e conoscenze adeguate per affrontare questi argomenti.
Si tratta di programmazione in real-mode, appoggiandosi alle funzioni offerte dal BIOS. Quelle funzioni vengono usate anche dai sistemi operativi moderni, ma solo nelle primissime fasi del bootstrap. Dopo di che il controllo passa al sistema operativo e ai suoi driver.
No, a volte vengono usati anche dopo il boot. Ma sono casi abbastanza rari (ad esempio per schede video per le quali c'è solo la modalità VESA).
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.