Chiarmenti su programma Assembly

di il
12 risposte

Chiarmenti su programma Assembly

Ciao a tutti ! Avrei bisogno di chiarimenti sul funzionamento del programma sottoriportato!!! Non riesco a capire come agisce il comando IDIV , in questo caso divido un registro a 16 bit ( AX ) per uno a 8 bit ( BL )...
Secondo il mio ragionamento il valore contenuto in AX viene diviso per BL ( ovvero -4 ) ma il risultato non torna, e se faccio il debug con visual studio, BL non assume il valore -4 , ma '252', come se da 0 tornasse indietro 255...254...253...252.
Se qualcuno ha voglia di darmi una delucidazione su come lavora la CPU con queste istruzioni glie ne sarei molto grato ! Grazie

Mat è uno short int ( 16 bit ) e vale 6569.

__asm
{       
        MOV AX,Mat
        OR AX, 0FFF1h
        MOV BL, -4
        IDIV BL // Divisione con segno di AX per r/m8 : ris in AL e resto in AH
        PUSH AX
        POP Ris
}

12 Risposte

  • Re: Chiarmenti su programma Assembly

    I numeri binari negativi sono espressi con la regola del "complemento a 2".

    Leggi

    http://it.wikipedia.org/wiki/Complemento_a_du

    e se hai ancora dubbi ne parliamo
  • Re: Chiarmenti su programma Assembly

    Certo si si lo so, infatti -4 in complemento a 2 e' 11111110 ! Ma anche detto quest non capisco come si comporta poi il programma!
  • Re: Chiarmenti su programma Assembly

    SsaLaroLana ha scritto:


    Certo si si lo so, infatti -4 in complemento a 2 e' 11111110 ! Ma anche detto quest non capisco come si comporta poi il programma!
    Come "lo sai" ? Ma se hai scritto "BL non assume il valore -4 , ma '252', come se da 0 tornasse indietro 255...254...253...252." ... vuol dire che non sai del complemento a due ... altrimenti non lo scriveresti ...

    Comunque, adesso non comprendo il tuo quesito ... cosa non capisci del programma?
  • Re: Chiarmenti su programma Assembly

    Ok, allora non mi sono spiegato bene !!! SE faccio il DEBUG con Visula Studio, il registro BL assume il valore 252, secondo il debug e da quanto vedo io , è contenuto 252 ! Comunque quello che non è capisco è come da una divisione di AX che vale 65529 ( ne sono certo ) dividendolo per BL che da quello che mi dici vale -4 il risultato per Visual Studio sia 64769 ! O.o''' Non capisco assolutamente come ragiona ecco!
  • Re: Chiarmenti su programma Assembly

    SsaLaroLana ha scritto:


    Non capisco assolutamente come ragiona ecco!
    Allora NON hai capito il complemento a 2, che invece mi dici di conoscere ...
  • Re: Chiarmenti su programma Assembly

    Oddio, io so fare la conversione di un numero in BASE 10 in numero in BASE 2 in complemento a 2, ma a questo punto se mi dici cosi NO, non ho capito come il compilatore tratta questa ! Se per favore riesci a spiegarmi come da quella divisione ne ricava quel risultato te ne sarei molto grato !
  • Re: Chiarmenti su programma Assembly

    Prima di spiegartelo come converti

    -4 (che è in base 10)

    in base 2 in complemento a 2 ?
  • Re: Chiarmenti su programma Assembly

    Praticamente faccio la BASE 2 del numero positivo 4, che in un registro a 8bit è 00000100, inverto gli 1 con i 0 quindi --> 11111011, poi aggiungo 1 bit --> 11111100. Dimmi se sbaglio.
  • Re: Chiarmenti su programma Assembly

    SsaLaroLana ha scritto:


    Praticamente faccio la BASE 2 del numero positivo 4, che in un registro a 8bit è 00000100, inverto gli 1 con i 0 quindi --> 11111011, poi aggiungo 1 bit --> 11111100. Dimmi se sbaglio.
    E' corretto ma a questo punto ti chiedo ... se leggi il valore 11111100 considerandolo positivo, quanto vale in decimale?
  • Re: Chiarmenti su programma Assembly

    Sembra propio valere 252!
  • Re: Chiarmenti su programma Assembly

    SsaLaroLana ha scritto:


    Sembra propio valere 252!
    Ecco ... quindi per riassumere


    65529 in esadecimale è FFF9 e in complemento a due vale -7
    252 in esadecimale è FC e in complemento a due vale -4

    Quindi stai facendo fare alla CPU la divisione

    -7 / -4

    Il risultato è nel registro AL e vale : 01 (in complemento a due vale 1)
    Il resto è nel registro AH e vale : FD (in complemento a due vale -3)

    Quindi

    -7 / -4 = 1 con resto -3
  • Re: Chiarmenti su programma Assembly

    Perfetto! Ora è tutto chiaro! Una risposta esauriente!!! Grazie mille!!!
Devi accedere o registrarti per scrivere nel forum
12 risposte