SAL/SAR

di il
8 risposte

SAL/SAR

Ciao a tutti,
ho da poco iniziato a studiare Assembly e mi sono imbattuto in un esercizio che non riesco a risolvere nonostante penso sia molto banale (vorrei capire se il risultato del libro è errato..)


Date le seguenti istruzioni:
MOV AL, 0CDh
MOV CL, 2
SAR AL, CL
Che valore assume AL?


Io ho convertito AL in binario: (0CD)h = (0000 1100 1101)2
Ho quindi spostato di due posizioni verso destra i bit avendo come risultato: 0000 0011 0011 = (033)h
Il risultato del libro dice 0F3h.

Sbaglio io o sbaglia lui?:D
Grazie a chiunque voglia aiutarmi!

8 Risposte

  • Re: SAL/SAR

    Dimentichi il segno e l'ampiezza del registro. Inizialmente AL contiene 11001101b, e quindi il bit più significativo è alto, il che implica che tratta di un numero negativo in complemento a due, pari a -51 in decimale.

    L'istruzione SAR effettua uno shift destro (in questo caso, CL volte) del semiregistro AL, e lo fa preservando il segno. Quindi il risultato F3h ossia 11110011b (-13) è corretto, e include il previsto arrotondamento verso meno infinito.
  • Re: SAL/SAR

    M.A.W. 1968 ha scritto:


    Dimentichi il segno e l'ampiezza del registro. Inizialmente AL contiene 11001101b, e quindi il bit più significativo è alto, il che implica che tratta di un numero negativo in complemento a due, pari a -51 in decimale.

    L'istruzione SAR effettua uno shift destro (in questo caso, CL volte) del semiregistro AL, e lo fa preservando il segno. Quindi il risultato F3h ossia 11110011b (-13) è corretto, e include il previsto arrotondamento verso meno infinito.
    Grazie per la risposta, ma potresti spiegarmi (scrivere) i calcoli che hai fatto? Grazie!
  • Re: SAL/SAR

    Il "calcolo" è di una banalità sconcertante: ho preso il valore 11001101b e l'ho semplicemente shiftato a destra di due posizioni, introducendo un valore unitario nelle due posizioni rimaste libere a sinistra, ossia le più significative, come richiesto dalla semantica dello shift aritmetico (sticky MSB rightshift) su numeri segnati.
  • Re: SAL/SAR

    M.A.W. 1968 ha scritto:


    Il "calcolo" è di una banalità sconcertante: ho preso il valore 11001101b e l'ho semplicemente shiftato a destra di due posizioni, introducendo un valore unitario nelle due posizioni rimaste libere a sinistra, ossia le più significative, come richiesto dalla semantica dello shift aritmetico (sticky MSB rightshift) su numeri segnati.
    Scusa se insisto ma vorrei capire meglio: con le operazioni di shift non vanno posti a 0 tutti i bit "nuovi"? Perché dovrei mettere 1 (ok per il segno, ho capito, ma matematicamente come ci arrivo? Devo considerarli sempre come complementi a due?)

    Grazie ancora per la pazienza!
  • Re: SAL/SAR

    Esistono sostanzialmente due distinti tipi di shift: quello logico e quello aritmetico. Inoltre una terza operazione assimilabile è la rotazione, che incontrerai a tempo debito.
    Per il momento, ti basti sapere che lo shift aritmetico implementato nella ISA Intel x86 da SAR opera esattamente come descritto, "trascinando" il bit più significativo a destra per ogni passo di shift, quale che sia il suo valore iniziale. Proprio per quello la chiamiamo sticky MSB! Se il MSB è pari a zero, l'operazione si comporta in modo ovviamente indistinguibile da altri tipi di rotazione: quando si ha il MSB pari ad uno, invece, si riscontra la differenza evidenziata.

    Altra differenza importante è l'approssimazione verso meno infinito, in sostanza l'aggiunta di un -1 al risultato approssimato. Nel caso dell'esercizio, il risultato della divisione intera tra -51 e 4 sarebbe -12, mentre SAR operando come descritto implica una approssimazione a -13.
  • Re: SAL/SAR

    Tutto chiaro, grazie!
    Ovviamente sbagliavo anche il numero di bit, al non può averne 12..doh

    Edit: anzi no! Perché se dovessi far lo shift a sinistra non dovrei tenere i bit di segno?? (Dal risultato del libro sembra cosi, nel caso di SAL di 2 bit..)
  • Re: SAL/SAR

    klizard ha scritto:


    Edit: anzi no! Perché se dovessi far lo shift a sinistra non dovrei tenere i bit di segno?? (Dal risultato del libro sembra cosi, nel caso di SAL di 2 bit..)
    Fino ad ora abbiamo parlato di SAR. SAL si comporta diversamente e non preserva il segno (su x86 e su molte altre piattaforme).
  • Re: SAL/SAR

    M.A.W. 1968 ha scritto:


    klizard ha scritto:


    Edit: anzi no! Perché se dovessi far lo shift a sinistra non dovrei tenere i bit di segno?? (Dal risultato del libro sembra cosi, nel caso di SAL di 2 bit..)
    Fino ad ora abbiamo parlato di SAR. SAL si comporta diversamente e non preserva il segno (su x86 e su molte altre piattaforme).
    Sisi scusa ho dimenticato di ri-ri-editare il testo: ho trovato la documentazione che mi serviva ed ho capito proprio questo che dicevi (SAL e SHL lavorano allo stesso modo, mettendo 0 ai bit "nuovi"; SAR riempie i bit di sinistra "nuovi" con il bit di segno, SHR pone a 0 i bit "nuovi")

    Grazie!
Devi accedere o registrarti per scrivere nel forum
8 risposte