Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-01-2010, 16:34   #1
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
[assembly] Dimensione istruzioni

Ciao.
Sapete indicarmi un metodo per risalire alla dimensione in byte di una certa istruzione assembly.

Ad esempio, quanti byte necessitano le istruzioni:

Codice:
movl $0x0, 0xc(%esi)  // 7 bytes?
che dovrebbero essere diverse da: ( la prima è più dispendiosa )
Codice:
movl $0x0, %eax // 5 bytes ?
Mi risulta che la dimensione cambi secondo l'OS e CPU. è corretto? Potete indicarmi come fare?
Oppure lo si può fare solo post compilazione con un debugger?

Il punto è che ho inserito dentro un programma C del codice asm con istruzioni tipo jmp indirizzo relativo .... e mi dà l'errore:
"Error: too many memory references for `jmp'", mi spiego? Credo di aver sbagliato a dargli l'indirizzo relativo.
Grazie.

Ultima modifica di Teo@Unix : 17-01-2010 alle 16:43.
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2010, 18:25   #2
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da Teo@Unix Guarda i messaggi
Ciao.
Sapete indicarmi un metodo per risalire alla dimensione in byte di una certa istruzione assembly. [/code]
La tabella degli opcode dell'ISA x86.
[code]Ad esempio, quanti byte necessitano le istruzioni:

Codice:
movl $0x0, 0xc(%esi)  // 7 bytes?
che dovrebbero essere diverse da: ( la prima è più dispendiosa )
Codice:
movl $0x0, %eax // 5 bytes ?
A naso direi che le dimensioni sono corrette.
Quote:
Mi risulta che la dimensione cambi secondo l'OS e CPU. è corretto?
No, sono sempre le stesse per la stessa ISA.
Quote:
Potete indicarmi come fare?
Oppure lo si può fare solo post compilazione con un debugger?
Puoi farlo a manina, ma è un casino da consultare l'opcode table.

Meglio utilizzare un assemblatore (che può generare un listato del sorgente originale a cui ha aggiunto i byte delle istruzioni) o un debugger.
Quote:
Il punto è che ho inserito dentro un programma C del codice asm con istruzioni tipo jmp indirizzo relativo .... e mi dà l'errore:
"Error: too many memory references for `jmp'", mi spiego? Credo di aver sbagliato a dargli l'indirizzo relativo.
Grazie.
Questo è molto strano, perché lo "sbrogliamento" degli offset è a carico dell'assemblatore.

Poi quel messaggio d'errore è la prima volta che lo leggo.
__________________
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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2010, 18:52   #3
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
grazie per la risp.
Quote:
No, sono sempre le stesse per la stessa ISA.
ok. Quindi i computer moderni sono tutti uguali tra loro.
Quote:
Meglio utilizzare un assemblatore (che può generare un listato del sorgente originale a cui ha aggiunto i byte delle istruzioni) o un debugger.
Io sono su Linux, quindi già qui mi viene indicata la dimensione giusto? (<main+29> sarà quindi 4 bytes? giusto? Non mi ricordavo più che bastava guardare qui ...)
Codice:
0x08048269 <main+25>:	mov    0x18(%esp),%eax
0x0804826d <main+29>:	movl   $0x0,0x8(%esp)
Se vuoi dare un'occhiata a gli errori per intero sono questi:
Codice:
shellcodeasm.c: Assembler messages:
shellcodeasm.c:43: Error: junk `popl %esimovl %esi' after expression
shellcodeasm.c:43: Error: junk `(%esi)movb $0x0' after expression
shellcodeasm.c:43: Error: too many memory references for `jmp'
la riga 43 incriminata è questa:
Codice:
42  void main() {
43  __asm__(
44  	  "jmp  0x2a"
45  	  "popl %esi"
	  ......
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2010, 19:03   #4
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da Teo@Unix Guarda i messaggi
Il punto è che ho inserito dentro un programma C del codice asm con istruzioni tipo jmp indirizzo relativo .... e mi dà l'errore:
"Error: too many memory references for `jmp'", mi spiego? Credo di aver sbagliato a dargli l'indirizzo relativo.
Grazie.
Mi sa che devi istruire il compilatore ad usare la sintassi Intel e non quella AT&T.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2010, 20:35   #5
rеpne scasb
Senior Member
 
Iscritto dal: May 2008
Messaggi: 533

Ultima modifica di rеpne scasb : 18-06-2012 alle 15:50.
rеpne scasb è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2010, 20:38   #6
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
Quote:
Puoi fare un semplice software per verificare la dimensione di un'istruzione assembly (x86-32bit):

Codice:
DB 0E8h,0h,0h,0h,0h

; Istruzione di cui si vuole calcolare la lunghezza

DB 0E8h,0h,0h,0h,0h
pop eax
pop ebx
neg ebx
lea eax,[eax+ebx-5h]

; In EAX trovi la dimensione dell'istruzione
buono.
però più che altro mi interessa capire perchè ho dei problemi con la compilazione... per la dimensione me la cavo comunque con gdb.

Quote:
Mi sa che devi istruire il compilatore ad usare la sintassi Intel e non quella AT&T.
ma come? non posso usare AT&T? In molti manuali vedo AT&T per le inline.
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2010, 20:47   #7
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Si' che puoi, ma quella sintassi e' la Intel.
Edit: No. Avevo letto male. Prova a mettere le istruzioni Intel e compilare, magari e' proprio il contrario.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2010, 20:49   #8
rеpne scasb
Senior Member
 
Iscritto dal: May 2008
Messaggi: 533

Ultima modifica di rеpne scasb : 18-06-2012 alle 15:50.
rеpne scasb è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2010, 21:49   #9
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
Quote:
Originariamente inviato da rеpne scasb Guarda i messaggi
E' raro che un compilatore di alto livello ti ritorni correttamente la dimensione di un'istruzione assembly
alla fine se scrivo con sintassi Intel e poi uso objdump per vedere la dimensione dovrei star più tranquillo? ok?
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 18-01-2010, 06:55   #10
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da Teo@Unix Guarda i messaggi
grazie per la risp.

ok. Quindi i computer moderni sono tutti uguali tra loro.
No. Se montano CPU con ISA diversa, cambia tutto il discorso.

Ma anche se prendi x86 come architettura, x86-64 (l'evoluzione a 64 bit) presenta già delle (succose) modifiche.
Quote:
Io sono su Linux, quindi già qui mi viene indicata la dimensione giusto? (<main+29> sarà quindi 4 bytes? giusto? Non mi ricordavo più che bastava guardare qui ...)
Codice:
0x08048269 <main+25>:	mov    0x18(%esp),%eax
0x0804826d <main+29>:	movl   $0x0,0x8(%esp)
Sembra di sì. Gli offset esadecimali corrispondono.
Quote:
Se vuoi dare un'occhiata a gli errori per intero sono questi:
Codice:
shellcodeasm.c: Assembler messages:
shellcodeasm.c:43: Error: junk `popl %esimovl %esi' after expression
shellcodeasm.c:43: Error: junk `(%esi)movb $0x0' after expression
shellcodeasm.c:43: Error: too many memory references for `jmp'
la riga 43 incriminata è questa:
Codice:
42  void main() {
43  __asm__(
44  	  "jmp  0x2a"
45  	  "popl %esi"
	  ......
Non ho mai usato la sintassi AT&T, ma mi sembra che ci siano problemi a fargliela digerire.

In ogni caso non penso che dovresti occuparti tu del calcolo della dimensione delle istruzioni e degli offset per i salti. Dovresti poter dichiarare delle etichette per i salti, e lasciare all'assemblatore il compito di generare le istruzioni di salto in maniera opportuna.

Altrimenti finisce come quando si lavorava in linguaggio macchina, e nel 2010 mi sembra un tantino esagerato.
__________________
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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 18-01-2010, 09:55   #11
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
No. Se montano CPU con ISA diversa, cambia tutto il discorso.
Capito.

Quote:
In ogni caso non penso che dovresti occuparti tu del calcolo della dimensione delle istruzioni e degli offset per i salti. Dovresti poter dichiarare delle etichette per i salti, e lasciare all'assemblatore il compito di generare le istruzioni di salto in maniera opportuna.

Altrimenti finisce come quando si lavorava in linguaggio macchina, e nel 2010 mi sembra un tantino esagerato.
Eh eh ... Sono d'accordissimo.
Tutto questo era per capire bene come funziona tutta la faccenda a livello piu basso possibile, vedo che si possono fare cose particolari quando si vanno a ritoccare le istruzioni. Cose che, naturalmente, a livello piu alto non ci si immagina di poter fare.

Per quanto riguarda il problema non ho ancora capito, per ora ho scritto tutto con sintassi intel, che è sicuramente piu pulita. Ed è ok.
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2010, 10:58   #12
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
tanto per farvi partecipe, guardate alla fine come doveva essere la inline con AT&T:

Codice:
void main()
{
	__asm__ (
	"jmp 0x2a\n\t"
	"popl %esi\n\t"
	"movb $0x0, 0x7(%esi)\n\t"
        [....]

        );
}
...
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2010, 13:11   #13
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
E immagino che fosse tutto ben documentato.
__________________
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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Nutanix rende disponibile Azure Virtual ...
Il padrino del deep learning avverte: gl...
Il finto avviso "iPhone Storage is Full"...
Dietrofront in Cina, addio touchscreen p...
Un piccolo accessorio trasforma lo smart...
Dopo 370 anni il Cyphral Distich non è p...
Oppo Find X10, X10 Pro Max e X10 E: conf...
Dal microscopio all'IA: un cervello di i...
Cyberpunk 2077 arriverà su Battle...
Altro che divieto: interi pallet di GeFo...
QNAPTS-h966TX, il NAS per chi fa editing...
Il trucco semplicissimo per installare W...
Apple rinvia due novità di iOS 27...
Una memoria ferroelettrica raggiunge 10 ...
Honor Magic 9, Pro Max e Super Edition: ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:29.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v