|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Aug 2012
Messaggi: 268
|
[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) ? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
è 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 |
![]() |
![]() |
![]() |
#3 | |
Member
Iscritto dal: Aug 2012
Messaggi: 268
|
Quote:
|
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
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). |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
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 ) |
|
![]() |
![]() |
![]() |
#6 | |
Member
Iscritto dal: Aug 2012
Messaggi: 268
|
Quote:
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 ![]() scusate , ma a cosa mi serve scrivere del codice dipendente dalle sue librerie ? |
|
![]() |
![]() |
![]() |
#7 | |
Member
Iscritto dal: Aug 2012
Messaggi: 268
|
Quote:
|
|
![]() |
![]() |
![]() |
#8 | ||
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
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 Quote:
l'unico intoppo si verifica quando si cerca di assemblare quei programmi su linux a 64 bit |
||
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Aug 2012
Messaggi: 268
|
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 |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
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 ) 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 Ultima modifica di pabloski : 24-07-2015 alle 14:30. |
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Anche solo per caricare in memoria un oggetto o leggere e scrivere sulla console devi usare le api o le convenzioni del sistema operativo. |
|
![]() |
![]() |
![]() |
#12 |
Member
Iscritto dal: Aug 2012
Messaggi: 268
|
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! |
![]() |
![]() |
![]() |
#13 | |||
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
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 Quote:
è una sua scelta, non sei obbligato a seguirla Quote:
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 Ultima modifica di pabloski : 24-07-2015 alle 18:36. |
|||
![]() |
![]() |
![]() |
#14 | |
Member
Iscritto dal: Aug 2012
Messaggi: 268
|
Quote:
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 |
|
![]() |
![]() |
![]() |
#15 | ||
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
momento
per assembly s'intende la rappresentazione mnemonica del linguaggio macchina, quest'ultimo è una sfilza di bytes Quote:
se vuoi la exit devi riscrivertela Quote:
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 |
||
![]() |
![]() |
![]() |
#16 |
Member
Iscritto dal: Aug 2012
Messaggi: 268
|
grazie mille ora mi è tutto più chiaro
![]() |
![]() |
![]() |
![]() |
#17 | ||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
![]() Quote:
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). Quote:
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). Quote:
Quote:
Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||||||
![]() |
![]() |
![]() |
#18 |
Member
Iscritto dal: Aug 2012
Messaggi: 268
|
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 ? Ultima modifica di toni00t : 30-07-2015 alle 09:24. |
![]() |
![]() |
![]() |
#19 | ||
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
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... esistono tanti tipi di ottimizzazioni, mica solo quella riguardante l'ottenimento delle massime prestazioni dalla cpu Quote:
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 |
||
![]() |
![]() |
![]() |
#20 |
Member
Iscritto dal: Aug 2012
Messaggi: 268
|
no , intedevo solo bios programming : Irvine nel suo libro ci dedica ben un capitolo per cui presumo sia qualcosa di importante
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:49.