Mostra notizie nelle discussioni
  • Avatar
    ☺
    Scritto da
    altg
    utente che non utiene
    il 2014-10-29 14:43:23.0 alle 2014-10-29 14:43:23.0
    Trollate totali: 11540
    Ho fatto la supercazzola al microprocessore.
    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. In lacrime

    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.
    • Avatar
      Scritto da
      Non Autenticato
      il 2014-10-29 14:47:40.0 alle 2014-10-29 14:47:40.0
      Re: Ho fatto la supercazzola al microprocessore.
      Scritto 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. In lacrime
      >
      > 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?
      • Avatar
        ☺
        Scritto da
        altg
        utente che non utiene
        il 2014-10-29 16:19:17.0 alle 2014-10-29 16:19:17.0
        Trollate totali: 11540
        Re: Ho fatto la supercazzola al microprocessore.
        > > 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. In lacrime
        > >
        > > 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.
    • Avatar
      ☺
      Scritto da
      avvelentani
      Cubicolario
      il 2014-10-29 15:01:21.0 alle 2014-10-29 15:01:21.0
      Trollate totali: 18184
      Re: Ho fatto la supercazzola al microprocessore.
      Scritto 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
      • Avatar
        ☺
        Scritto da
        altg
        utente che non utiene
        il 2014-10-29 16:05:06.0 alle 2014-10-29 16:05:06.0
        Trollate totali: 11540
        Re: Ho fatto la supercazzola al microprocessore.
        > > (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. Idea!

        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.
        • Avatar
          ☺
          Scritto da
          avvelentani
          Cubicolario
          il 2014-10-29 16:14:55.0 alle 2014-10-29 16:14:55.0
          Trollate totali: 18184
          Re: Ho fatto la supercazzola al microprocessore.
          Scritto 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. Idea!

          ah/sp
          bh/di
          ch/bp
          dh/si

          I think happiness is love
          - Vladimir Putin
          • Avatar
            ☺
            Scritto da
            altg
            utente che non utiene
            il 2014-10-29 16:34:50.0 alle 2014-10-29 16:34:50.0
            Trollate totali: 11540
            Re: Ho fatto la supercazzola al microprocessore.
            > > > > (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. Idea!
            >
            > ah/sp
            > bh/di
            > ch/bp
            > dh/si

            Sicche` t'interessi anche di assembly? Geek
            • Avatar
              ☺
              Scritto da
              avvelentani
              Cubicolario
              il 2014-10-29 16:37:16.0 alle 2014-10-29 16:37:16.0
              Trollate totali: 18184
              Re: Ho fatto la supercazzola al microprocessore.
              Scritto 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. Idea!
              > >
              > > ah/sp
              > > bh/di
              > > ch/bp
              > > dh/si
              >
              > Sicche` t'interessi anche di assembly? Geek

              no.
              I think happiness is love
              - Vladimir Putin
              • Avatar
                ☺
                Scritto da
                altg
                utente che non utiene
                il 2014-10-29 18:31:18.0 alle 2014-10-29 18:31:18.0
                Trollate totali: 11540
                Re: Ho fatto la supercazzola al microprocessore.
                > > > > > 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. Idea!
                > > >
                > > > ah/sp
                > > > bh/di
                > > > ch/bp
                > > > dh/si
                > >
                > > Sicche` t'interessi anche di assembly? Geek
                >
                > 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. Triste
                • Avatar
                  ☺
                  Scritto da
                  avvelentani
                  Cubicolario
                  il 2014-10-29 20:29:44.0 alle 2014-10-29 20:29:44.0
                  Trollate totali: 18184
                  Re: Ho fatto la supercazzola al microprocessore.
                  Scritto da: altg
                  > > > >
                  > > > > ah/sp
                  > > > > bh/di
                  > > > > ch/bp
                  > > > > dh/si
                  > > >
                  > > > Sicche` t'interessi anche di assembly? Geek
                  > >
                  > > 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. Triste

                  Mi sembrava strano che non avessi l'equivalente windowsiano di SIGILL, era necessario capire perche'
                  I think happiness is love
                  - Vladimir Putin
                  • Avatar
                    ☺
                    Scritto da
                    altg
                    utente che non utiene
                    il 2014-10-29 21:21:35.0 alle 2014-10-29 21:21:35.0
                    Trollate totali: 11540
                    Re: Ho fatto la supercazzola al microprocessore.
                    > > > > > ah/sp
                    > > > > > bh/di
                    > > > > > ch/bp
                    > > > > > dh/si
                    > > > >
                    > > > > Sicche` t'interessi anche di assembly? Geek
                    > > >
                    > > > 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. Triste
                    >
                    > 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...
            • Avatar
              Scritto da
              Non Autenticato
              il 2014-10-29 16:40:00.0 alle 2014-10-29 16:40:00.0
              Re: Ho fatto la supercazzola al microprocessore.
              Scritto 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. Idea!
              > >
              > > ah/sp
              > > bh/di
              > > ch/bp
              > > dh/si
              >
              > Sicche` t'interessi anche di assembly? Geek

              Il suo attuale impiego è quello di riscrivere le parti prestazionalmente critiche di blasonati software direttamente in assembly.
<softv>

Pagina generata in 154 millisecondi

Utenti attivi: 7 nell'ultimo minuto, 21 negli ultimi cinque minuti, 44 negli ultimi 15 minuti