Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-01-2010, 17: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 17:43.
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2010, 19: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, 19: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, 20: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, 21:35   #5
rеpne scasb
Senior Member
 
Iscritto dal: May 2008
Messaggi: 533

Ultima modifica di rеpne scasb : 18-06-2012 alle 16:50.
rеpne scasb è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2010, 21: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, 21: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, 21:49   #8
rеpne scasb
Senior Member
 
Iscritto dal: May 2008
Messaggi: 533

Ultima modifica di rеpne scasb : 18-06-2012 alle 16:50.
rеpne scasb è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2010, 22: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, 07: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, 10: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, 11: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, 14: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


Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
Funzionalità top a un prezzo acce...
Lo strumento per gli aggiornamenti autom...
Imperdibile sconto sul roborock Saros Z7...
Google Pixel 10, altri 100€ di sconto su...
Chip sotto i 2 nanometri, l'Europa alza ...
La smart meno smart di tutte: #6 in azio...
Red Hat Enterprise Linux sbarca su AWS E...
Addio alle migliaia di cicli e anni di t...
Colpo di STMicroelectronics, un'intesa d...
La Ferrari elettrica si chiama Luce: ecc...
Proseguono le riparazioni in vista del l...
Cinema domestico low cost: proiettore Fu...
Sharp porta a ISE 2026 i nuovi display i...
Casa più sicura senza lavori: Arl...
Batterie esauste, l'Italia raccoglie sol...
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: 04:50.


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