-
Ho fatto la supercazzola al microprocessore.Scritto daaltgutente che non utieneil 2014-10-29 14:43:23.0 alle 2014-10-29 14:43:23.0Trollate totali: 11540Ci ho messo tutta la mattina a capirlo. Avevo scorciato, a suo tempo, delle istruzioni che l'assembler interno poteva rappresentare con operandi di 8 bit quando implicavano un registro a cui veniva applicato un operando immediato sufficientemente piccolo. Sicche` avevo tradotto, ad esempio:
TEST EAX, 0xFF
con una piu` breve
TEST AL, 0xFF
che tanto e` uguale, ai fini dei flag che imposta: nella fattispecie, se tra gli 8 bit meno significativi di EAX ce n'e` almeno uno impostato a 1, il risultato e` non-zero. Fin qui tutto bene, il problema e` che m'ero scordato di verificare che il registro in questione fosse uno dei quattro che hanno una parte bassa a 8 bit (EAX ha AL, EBX ha BL, ECX ha CL, EDX ha DL), e avevo allegramente esteso l'ottimizzazione anche a ESI, EDI, ESP, EBP, che non hanno sottoregistri a 8 bit. Sicche` stamani l'assembler interno stava traducendo:
if r has oddBites
(che significa "se r ha impostati i bit che compongono il valore immediato 3", cioe` se r/4 da` un resto, cioe` se r non e` multiplo di 4) con la sequenza in linguaggio macchina:
F6C603
con quella stava chiedendo, provocando un crash che non mi spiegavo, al microprocessore "testa i bit del valore 3 nel sottoregistro a 8 bit di ESI". E siccome il sottoregistro a 8 bit di ESI non esiste, chissa` cosa capiva; secondo me si chiedeva "EH?! BOH!" e pero` non crashava in quel punto, provocava un crash per via del risultato sbagliato di un arrotondamento per eccesso che allocava un blocco di heap un po' piu` piccolo del necessario. La sequenza corretta usa per forza la forma a 32 bit, cioe`:
F7C603000000
e ora va bene, ma boja, c'e` voluta tutta la mattina a scoprire perche` cazzo non funzionava. L'istruzione sembrava corretta, infatti, nel sorgente L.in.oleum. Ma veniva assemblata male.
No, lo raccontavo perche` trovato divertente l'aver scoperto di aver usato un opcode a 8 bit su un registro di 32, come se facessi riferimento all'inesistente sottoregistro SI-L. Um... ma vedo che non diverte.-
Re: Ho fatto la supercazzola al microprocessore.Scritto daNon Autenticatoil 2014-10-29 14:47:40.0 alle 2014-10-29 14:47:40.0Scritto da: altg
> Ci ho messo tutta la mattina a capirlo. Avevo scorciato, a suo tempo, delle istruzioni che l'assembler interno poteva rappresentare con operandi di 8 bit quando implicavano un registro a cui veniva applicato un operando immediato sufficientemente piccolo. Sicche` avevo tradotto, ad esempio:
>
> TEST EAX, 0xFF
>
> con una piu` breve
>
> TEST AL, 0xFF
>
> che tanto e` uguale, ai fini dei flag che imposta: nella fattispecie, se tra gli 8 bit meno significativi di EAX ce n'e` almeno uno impostato a 1, il risultato e` non-zero. Fin qui tutto bene, il problema e` che m'ero scordato di verificare che il registro in questione fosse uno dei quattro che hanno una parte bassa a 8 bit (EAX ha AL, EBX ha BL, ECX ha CL, EDX ha DL), e avevo allegramente esteso l'ottimizzazione anche a ESI, EDI, ESP, EBP, che non hanno sottoregistri a 8 bit. Sicche` stamani l'assembler interno stava traducendo:
>
> if r has oddBites
>
> (che significa "se r ha impostati i bit che compongono il valore immediato 3", cioe` se r/4 da` un resto, cioe` se r non e` multiplo di 4) con la sequenza in linguaggio macchina:
>
> F6C603
>
> con quella stava chiedendo, provocando un crash che non mi spiegavo, al microprocessore "testa i bit del valore 3 nel sottoregistro a 8 bit di ESI". E siccome il sottoregistro a 8 bit di ESI non esiste, chissa` cosa capiva; secondo me si chiedeva "EH?! BOH!" e pero` non crashava in quel punto, provocava un crash per via del risultato sbagliato di un arrotondamento per eccesso che allocava un blocco di heap un po' piu` piccolo del necessario. La sequenza corretta usa per forza la forma a 32 bit, cioe`:
>
> F7C603000000
>
> e ora va bene, ma boja, c'e` voluta tutta la mattina a scoprire perche` cazzo non funzionava. L'istruzione sembrava corretta, infatti, nel sorgente L.in.oleum. Ma veniva assemblata male.
>
> No, lo raccontavo perche` trovato divertente l'aver scoperto di aver usato un opcode a 8 bit su un registro di 32, come se facessi riferimento all'inesistente sottoregistro SI-L. Um... ma vedo che non diverte.
Ma sarà più veloce del C anche stavolta?-
Re: Ho fatto la supercazzola al microprocessore.Scritto daaltgutente che non utieneil 2014-10-29 16:19:17.0 alle 2014-10-29 16:19:17.0Trollate totali: 11540> > Ci ho messo tutta la mattina a capirlo. Avevo scorciato, a suo tempo, delle istruzioni che l'assembler interno poteva rappresentare con operandi di 8 bit quando implicavano un registro a cui veniva applicato un operando immediato sufficientemente piccolo. Sicche` avevo tradotto, ad esempio:
> >
> > TEST EAX, 0xFF
> >
> > con una piu` breve
> >
> > TEST AL, 0xFF
> >
> > che tanto e` uguale, ai fini dei flag che imposta: nella fattispecie, se tra gli 8 bit meno significativi di EAX ce n'e` almeno uno impostato a 1, il risultato e` non-zero. Fin qui tutto bene, il problema e` che m'ero scordato di verificare che il registro in questione fosse uno dei quattro che hanno una parte bassa a 8 bit (EAX ha AL, EBX ha BL, ECX ha CL, EDX ha DL), e avevo allegramente esteso l'ottimizzazione anche a ESI, EDI, ESP, EBP, che non hanno sottoregistri a 8 bit. Sicche` stamani l'assembler interno stava traducendo:
> >
> > if r has oddBites
> >
> > (che significa "se r ha impostati i bit che compongono il valore immediato 3", cioe` se r/4 da` un resto, cioe` se r non e` multiplo di 4) con la sequenza in linguaggio macchina:
> >
> > F6C603
> >
> > con quella stava chiedendo, provocando un crash che non mi spiegavo, al microprocessore "testa i bit del valore 3 nel sottoregistro a 8 bit di ESI". E siccome il sottoregistro a 8 bit di ESI non esiste, chissa` cosa capiva; secondo me si chiedeva "EH?! BOH!" e pero` non crashava in quel punto, provocava un crash per via del risultato sbagliato di un arrotondamento per eccesso che allocava un blocco di heap un po' piu` piccolo del necessario. La sequenza corretta usa per forza la forma a 32 bit, cioe`:
> >
> > F7C603000000
> >
> > e ora va bene, ma boja, c'e` voluta tutta la mattina a scoprire perche` cazzo non funzionava. L'istruzione sembrava corretta, infatti, nel sorgente L.in.oleum. Ma veniva assemblata male.
> >
> > No, lo raccontavo perche` trovato divertente l'aver scoperto di aver usato un opcode a 8 bit su un registro di 32, come se facessi riferimento all'inesistente sottoregistro SI-L. Um... ma vedo che non diverte.
>
> Ma sarà più veloce del C anche stavolta?
Dipende da cosa fa il C-qualcosa. Ricordo che nel 2008 in una prova buttata li` in questo thread sembrava sverniciare C++, C# e Java.http://anynowhere.com/bb/posts.php?t=3874&p=8

Magari il C semplice no, quello magari non si fa le seghe.
-
-
Re: Ho fatto la supercazzola al microprocessore.Scritto daavvelentaniCubicolarioil 2014-10-29 15:01:21.0 alle 2014-10-29 15:01:21.0Trollate totali: 18184Scritto da: altg
> (che significa "se r ha impostati i bit che compongono il valore immediato 3", cioe` se r/4 da` un resto, cioe` se r non e` multiplo di 4) con la sequenza in linguaggio macchina:
>
> F6C603
>
> con quella stava chiedendo, provocando un crash che non mi spiegavo, al microprocessore "testa i bit del valore 3 nel sottoregistro a 8 bit di ESI". E siccome il sottoregistro a 8 bit di ESI non esiste, chissa` cosa capiva;
Capiva
test dh,0x3
perche' e` quello che hai assemblato.I think happiness is love
- Vladimir Putin-
Re: Ho fatto la supercazzola al microprocessore.Scritto daaltgutente che non utieneil 2014-10-29 16:05:06.0 alle 2014-10-29 16:05:06.0Trollate totali: 11540> > (che significa "se r ha impostati i bit che compongono il valore immediato 3", cioe` se r/4 da` un resto, cioe` se r non e` multiplo di 4) con la sequenza in linguaggio macchina:
> >
> > F6C603
> >
> > con quella stava chiedendo, provocando un crash che non mi spiegavo, al microprocessore "testa i bit del valore 3 nel sottoregistro a 8 bit di ESI". E siccome il sottoregistro a 8 bit di ESI non esiste, chissa` cosa capiva;
>
> Capiva
>
> test dh,0x3
>
> perche' e` quello che hai assemblato.
Ah badaganzo, allora sugli opcode reg8 usano il reg ID di ESI per rappresentare DH.
Be' non avevo approfondito perche` all'assembler interno non servono i byte alti dei registri a 16 bit. Anche se uhmmm... in effetti aprono a una possibile ottimizzazione quando uno scrive qualcosa che viene tradotto in TEST EDX, 0x300. Gia` gia`, me lo appunto.-
Re: Ho fatto la supercazzola al microprocessore.Scritto daavvelentaniCubicolarioil 2014-10-29 16:14:55.0 alle 2014-10-29 16:14:55.0Trollate totali: 18184Scritto da: altg
> > > (che significa "se r ha impostati i bit che compongono il valore immediato 3", cioe` se r/4 da` un resto, cioe` se r non e` multiplo di 4) con la sequenza in linguaggio macchina:
> > >
> > > F6C603
> > >
> > > con quella stava chiedendo, provocando un crash che non mi spiegavo, al microprocessore "testa i bit del valore 3 nel sottoregistro a 8 bit di ESI". E siccome il sottoregistro a 8 bit di ESI non esiste, chissa` cosa capiva;
> >
> > Capiva
> >
> > test dh,0x3
> >
> > perche' e` quello che hai assemblato.
>
> Ah badaganzo, allora sugli opcode reg8 usano il reg ID di ESI per rappresentare DH.
ah/sp
bh/di
ch/bp
dh/si
I think happiness is love
- Vladimir Putin-
Re: Ho fatto la supercazzola al microprocessore.Scritto daaltgutente che non utieneil 2014-10-29 16:34:50.0 alle 2014-10-29 16:34:50.0Trollate totali: 11540> > > > (che significa "se r ha impostati i bit che compongono il valore immediato 3", cioe` se r/4 da` un resto, cioe` se r non e` multiplo di 4) con la sequenza in linguaggio macchina:
> > > >
> > > > F6C603
> > > >
> > > > con quella stava chiedendo, provocando un crash che non mi spiegavo, al microprocessore "testa i bit del valore 3 nel sottoregistro a 8 bit di ESI". E siccome il sottoregistro a 8 bit di ESI non esiste, chissa` cosa capiva;
> > >
> > > Capiva
> > >
> > > test dh,0x3
> > >
> > > perche' e` quello che hai assemblato.
> >
> > Ah badaganzo, allora sugli opcode reg8 usano il reg ID di ESI per rappresentare DH.
>
> ah/sp
> bh/di
> ch/bp
> dh/si
Sicche` t'interessi anche di assembly?
-
Re: Ho fatto la supercazzola al microprocessore.Scritto daavvelentaniCubicolarioil 2014-10-29 16:37:16.0 alle 2014-10-29 16:37:16.0Trollate totali: 18184Scritto da: altg
> > > >
> > > > Capiva
> > > >
> > > > test dh,0x3
> > > >
> > > > perche' e` quello che hai assemblato.
> > >
> > > Ah badaganzo, allora sugli opcode reg8 usano il reg ID di ESI per rappresentare DH.
> >
> > ah/sp
> > bh/di
> > ch/bp
> > dh/si
>
> Sicche` t'interessi anche di assembly?
no.I think happiness is love
- Vladimir Putin-
Re: Ho fatto la supercazzola al microprocessore.Scritto daaltgutente che non utieneil 2014-10-29 18:31:18.0 alle 2014-10-29 18:31:18.0Trollate totali: 11540> > > > > Capiva
> > > > >
> > > > > test dh,0x3
> > > > >
> > > > > perche' e` quello che hai assemblato.
> > > >
> > > > Ah badaganzo, allora sugli opcode reg8 usano il reg ID di ESI per rappresentare DH.
> > >
> > > ah/sp
> > > bh/di
> > > ch/bp
> > > dh/si
> >
> > Sicche` t'interessi anche di assembly?
>
> no.
Ah, capisco, era solo per precisare che non c'era nessun mystero nell'istruzione che avevo assemblato per sbaglio, e rovinare tutta la poesia. Peccato.
-
Re: Ho fatto la supercazzola al microprocessore.Scritto daavvelentaniCubicolarioil 2014-10-29 20:29:44.0 alle 2014-10-29 20:29:44.0Trollate totali: 18184Scritto da: altg
> > > >
> > > > ah/sp
> > > > bh/di
> > > > ch/bp
> > > > dh/si
> > >
> > > Sicche` t'interessi anche di assembly?
> >
> > no.
>
> Ah, capisco, era solo per precisare che non c'era nessun mystero nell'istruzione che avevo assemblato per sbaglio, e rovinare tutta la poesia. Peccato.
Mi sembrava strano che non avessi l'equivalente windowsiano di SIGILL, era necessario capire perche'I think happiness is love
- Vladimir Putin-
Re: Ho fatto la supercazzola al microprocessore.Scritto daaltgutente che non utieneil 2014-10-29 21:21:35.0 alle 2014-10-29 21:21:35.0Trollate totali: 11540> > > > > ah/sp
> > > > > bh/di
> > > > > ch/bp
> > > > > dh/si
> > > >
> > > > Sicche` t'interessi anche di assembly?
> > >
> > > no.
> >
> > Ah, capisco, era solo per precisare che non c'era nessun mystero nell'istruzione che avevo assemblato per sbaglio, e rovinare tutta la poesia. Peccato.
>
> Mi sembrava strano che non avessi l'equivalente windowsiano di SIGILL, era necessario capire perche'
C'e`, c'e`, infatti era probabile che fosse un'istruzione valida che facesse qualcosa di diverso. E poi a me, in retrospettiva, pareva strano che la Intel avesse lasciato dei buchi cosi` vistosi in istruzioni di soli 3 bytes, era abbastanza probabile che il codice di ESI fosse usato per qualcos'altro se l'opcode era F6 invece di F7...
-
-
-
-
Re: Ho fatto la supercazzola al microprocessore.Scritto daNon Autenticatoil 2014-10-29 16:40:00.0 alle 2014-10-29 16:40:00.0Scritto da: altg
> > > > > (che significa "se r ha impostati i bit che compongono il valore immediato 3", cioe` se r/4 da` un resto, cioe` se r non e` multiplo di 4) con la sequenza in linguaggio macchina:
> > > > >
> > > > > F6C603
> > > > >
> > > > > con quella stava chiedendo, provocando un crash che non mi spiegavo, al microprocessore "testa i bit del valore 3 nel sottoregistro a 8 bit di ESI". E siccome il sottoregistro a 8 bit di ESI non esiste, chissa` cosa capiva;
> > > >
> > > > Capiva
> > > >
> > > > test dh,0x3
> > > >
> > > > perche' e` quello che hai assemblato.
> > >
> > > Ah badaganzo, allora sugli opcode reg8 usano il reg ID di ESI per rappresentare DH.
> >
> > ah/sp
> > bh/di
> > ch/bp
> > dh/si
>
> Sicche` t'interessi anche di assembly?
Il suo attuale impiego è quello di riscrivere le parti prestazionalmente critiche di blasonati software direttamente in assembly.
-
-
-
-
-
Re: Ho fatto la supercazzola al microprocessore.Scritto daMitzkyLa castratrice di trollil 2014-10-29 16:30:00.0 alle 2014-10-29 16:30:00.0Trollate totali: 1072
Una donna senza un uomo e' come un pesce senza bici.
-