Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [ASM] maledetti bit di flag !!

    Stavo preparando degli esercizi per l'esame di calcolatori elettronici e mi sto accorgendo che sto sbagliando tutte le domande relativi ai bit di flag . In particolare quelli di overflow e ausiliary.

    Vi faccio un esempio concreto..

    Ho in
    AL = 63h
    CL = 6C

    ora a seguiti delle seguenti istruzioni
    codice:
                  AL   CL | OF  AF  CF
    ADD AL, AL    C6   6C   1   0   0
    SUB CL, AL    C6   A6   1   0   1
    Non ho capito perchè in entrambe le istruzioni scattano i bit di overflow !!

    Ragazzi se sapete dove posso trovare un po' di doc.. sto cercndo su giobe2000 ma mi sto perdendo !
    Vi prego è urgente..

    Ciao
    Alex

  2. #2
    Nel primo caso forse l`overflow scatta perche` se l`addizione e` considerata signed, c`e` in effetti un overflow perche` scavalca 127.

    Nel secondo un overflow ci sarebbe se la sottrazione fosse unsigned.

    Purtroppo non ti posso assicurare nulla.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    305
    stai adoperando registri AL e CL ovvero 8bit
    con 8 bit puoi rappresentare al massimo il numero 256
    16*16 che può essere contenuto in un registro a 8 bit:
    eseguendo
    add al,al ...........
    non fai altro che addizionare
    c6 che è uguale a 198
    quindi al+al = 396
    quindi il registro a 8 bit non può contenere il numero 396, ma al massimo 256 che equivale a 0, per questo il flag di overflow è = 1.

    Se stampi il risultato 396 con un registro a 8 bit otterrai 140

    per stampare correttamente il risultato 396 devi usare un registro a 16 bit, AX, o meglio devi convertire i bit con l'apposita routine
    (div / 10) per ottenere il numero in decimale (hehhehee!!)
    ...... stessa cosa cun la sub dove vai in negativo CF = 1 con riporto del complemento a 1 (studia il complemento a 2 per i numeri negativi)

    sub cl,al cl=198 -127 = 71
    71 - 99 (63h)

    come vedi su 8bit il processore calcola 71-99
    hai overflow e cf (carry flag) insomma il riporto come nella normale sottrazione elementare.

    Istruisci bene il processore, in qunto tu devi essere di alto livello.............




    x r0x
    in asm, il calcolatore non sà che cosè un signed o unsigned
    non sà nemmeno cosa sono i caratteri, il calcolatore riconosce solo nnumeri.
    il registro AX contiene 16 bit, AL contiene gli 8 bit meno significatici di AX, ovvero AL (byte basso o 2 nibble 8 bit)
    AH (8 bit più significativi)........ AH e AL possono contenere 256 = 0
    AX invece 65536 = 0

    AL = 1111 1111 = FF = 255 ............ complemento a 1
    AL = 1000 0000 = 80 = 128 ............ complemento a 2

  4. #4
    O mi sono rincoglionito completamente o c'è qualcosa che non mi quadra in quello che hai detto..
    Originariamente inviato da scancode
    stai adoperando registri AL e CL ovvero 8bit
    con 8 bit puoi rappresentare al massimo il numero 256
    16*16 che può essere contenuto in un registro a 8 bit:
    e fin qua ci siamo...
    eseguendo
    add al,al ...........
    non fai altro che addizionare
    c6 che è uguale a 198
    quindi al+al = 396
    addizionando 63h + 63h ottengo C6.. e basta! Da dove salta fuori quel 396 ? E' il doppio di quanto dovrebbe uscire !

    quindi tutte le considerazioni che hai fatto dopo sono errate perchè tu consideri come risultato 396 ma è sbagliato! Il vero risultato è 196 !(penso che tu abbia considerato i valori scritti di fianco all'istruzione.. quelli sono i risultati. I valori di partenza stanno sopra)

    quindi il registro a 8 bit non può contenere il numero 396, ma al massimo 256 che equivale a 0, per questo il flag di overflow è = 1.

    Se stampi il risultato 396 con un registro a 8 bit otterrai 140

    per stampare correttamente il risultato 396 devi usare un registro a 16 bit, AX, o meglio devi convertire i bit con l'apposita routine
    (div / 10) per ottenere il numero in decimale (hehhehee!!)


    ...... stessa cosa cun la sub dove vai in negativo CF = 1 con riporto del complemento a 1 (studia il complemento a 2 per i numeri negativi)

    sub cl,al cl=198 -127 = 71
    71 - 99 (63h)
    il complemento a due di 198 è 58..

    non dovresti fare
    AL + Compl2(198) =
    AL + 58 = 108 + 58 = 164 ???


    Insomma hai confuso i valori da prendere in considerazione. Quelli scritti di fianco sono i risultati ottenuti subito dopo l'esecuzione dell'istruzione .

  5. #5
    codice:
    cl=198 -127 = 71
    scancode .. ma di cosa parli che non sai fare neanche un complemento a 2? 198 complementato a 2 e` ( 2^8 - 198 ), quindi va a finire a -58, come giustamente ha osservato alex.

    codice:
    in asm, il calcolatore non sà che cosè un signed o unsigned
    Il fatto che io parlassi di signed/unsigned e` giustificato dall`esistenza dei flags. A seconda di come prendiamo in considerazione i suddetti flags possiamo gestire operazioni con segno o senza segno. E` ovvio quindi che a seconda dei casi, i flags avranno significato diverso.

    Ti torna? Guarda, io ammetto di essere un po` arruginito ma almeno non azzardo piu` di tanto. Schiarisciti le idee prima di criticare. :quipy:

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    305
    okay, allora in altre parole.............
    c6 corrisponde a 198 in dec
    in binario corrisponde a:
    11000110
    ^------- (ti indico il bit più significativo)

    il flag di OF viene abilitato in quanto il bit numero 8 (lo vedi....?)è uguale a 1

    è uguale a 1 perchè viene superato il numro 127
    128 64 32 16 8 4 2 1

    questo per add
    -----------------------

    per la sub ottieni c6-c6 = 0
    LO ZERO, nel tuo caso è così
    10000000
    ^------- (ti indico il bit più segnificativo)
    quindi, anche in questo caso, hai il bit più significativo a 1 (lo vedi.......?)
    quindi OF = 1 e riporto di 1 perchè riporti 1 all'overflow e cioè lo zero

    spero di essermi spiegato.............
    ma è meglio che studi un pò

    per studio:
    1111111 (conta gli i bit sono 7) = 127
    11111111 = 255
    ora questo è il contachilometri di AL............
    ora se aggiungi 255 + 1 cosa ottieni?

    per la tua sub
    10000000 = zero ... quindi OF = 1 CF = 1 (riporto del contachilomtri)
    per la tua add
    11000110 = 198 CF = 0 OF = 1 ai il bit più significativo a 1 l'ottavo






    ciao


    P.S.
    Proprio per la regola che il pc non cosidera signed o unsigned è il programmatore che sceglie di operare signed o unsigned

    i flag vengono trattati dal x86, sempre in questo modo........
    sei tu che devi decidere l'output da stampare......... in definitiva sei tu che devi interpretare che numero vuoi che stampi il pc
    -128 = 0 - 128 = 256 - 128 = 128 = 10000000B

  7. #7
    Originariamente inviato da scancode
    okay, allora in altre parole.............
    c6 corrisponde a 198 in dec
    in binario corrisponde a:
    11000110
    ^------- (ti indico il bit più significativo)

    il flag di OF viene abilitato in quanto il bit numero 8 (lo vedi....?)è uguale a 1

    è uguale a 1 perchè viene superato il numro 127
    128 64 32 16 8 4 2 1

    questo per add
    Sui miei manuali il flag che si attiva quando il bit più significativo è 1 è quello di segno..

    per la sub ottieni c6-c6 = 0
    LO ZERO, nel tuo caso è così
    10000000
    ^------- (ti indico il bit più segnificativo)
    quindi, anche in questo caso, hai il bit più significativo a 1 (lo vedi.......?)
    quindi OF = 1 e riporto di 1 perchè riporti 1 all'overflow e cioè lo zero
    guarda che la seconda istruzione è
    SUB CL, AL
    con CL = 6C
    e AL = C6

    spero di essermi spiegato.............
    ma è meglio che studi un pò

    hai le idee un bel po' confuse e permettimi di rimandarti lo stesso suggerimento..

    Ciao
    Alex

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    305
    Non ho le idee confuse...............
    ma è che sono un pò folle come tutti quelli che programmano in assembler!!!!!!!

    Ho fatto caso al c6 e 6c e l'ho interpretato little endian, per quanto riguarda ciò che ho detto, ..... proprio perchè ci sono passato, puoi avere una montagna di manuali, ma quello che ti scrivo adesso dovrebbe esserti molto più chiaro di quella montagna di manuali..................


    secondo te a che corrisponde tale numero????????
    1001
    la tua risposta è, corrisponde a 9
    .......giusto
    io ti dico che per il pc corrisponde indifferentemente
    sia al numero 9 che al numero -1

    .........per questo motivo se il bit più significativo è = 1
    il flag OF, l'11, è settato a uno, zeroflag = 1





    prendiamo ad esempio 4 bit
    0000
    8421

    il numero massimo rappresentabi1 è 15 e cioè:
    1111

    fino al numero 7 il bit più significativo è 0
    0111 = 7
    ^----------il bit 4 è 0 quindi il flag di ovreflow è = 0
    ......se superi il numero 7 il flag di overflow sarà settato a 1

    1000 = 8
    il bit 4 è = 1, il flag di overflow è = 1
    il signed flag è settato a 1

    tu come programmatore puoi decidere se trattare il numero come signed o unsigned, oppure come positovo e negativo

    infatti:
    1001 come lo vuoi stampare come 9 oppure -1 ?????????

    ........ se il numero non può essere contenuto nel contachilometri (in questo caso un nibble che chiaramente non esiste come registro), per esmpio 16
    il nibble verrà azzerato 0000 se il numero della tua operazione è 17
    avrai 0001 = 1
    OF = 1 (perche stai in overflow, non può essere contenuto nel registro)
    CF = 1 (il riporto)
    SF = 0 (il flag di sengo è 0)
    CF = 1 (il riporto)

    per concludere:
    Risultati........ (che ti entri in testa che è stata eseguita un operaqzione)

    0010 = 2 OF = 0 SF = 0 CF = 0
    1110 = 13 OF = 1 SF = 1 CF = 1 (riporto 1)
    0000 = OF = 1 SF = 0 CF = 1 CF = 1
    ---------------------------------------------

    per questo motivo il pc, con i flag ti dice, come devi comportarti, perchè il pc non sà come deve precedere, in qunto non sà cosa è il segno + o il segno -, ovvero numeri positivi e numeri negativi
    Allora tu che sei di ALTO LIVELLO....... che fai????????

    se vuoi considerare 1001 = 9
    stampi 9
    se vuoi considerare 1001 = -1
    stampi il carattere "-" che in esa corrisponde a 2dh e poi 1001

    attraverso l'apposita routine di conversione binario ascii
    (hehhehe) = corrisponde alla fatica che ho fatto per capire tutto questo.............

    ---------------------------------------------


    ...........è chiaro ora??? (insomma.......??)

  9. #9
    1001
    la tua risposta è, corrisponde a 9
    .......giusto
    io ti dico che per il pc corrisponde indifferentemente
    sia al numero 9 che al numero -1
    -1? Da quando gli x86 usano la rappresentazione modulo e segno? E poi non stiamo parlando di complemento a 2 da giorni? Per me non sei nient`altro che l`ennesimo chiacchierone.

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    305
    rox,......... mi fai tenerezza

    ........ Da quando i progettisti della intel hanno avuto la geniale idea, di inventarsi il Signed flag (o segnalatore di segno) che indica, a noi programmatori, di decidere come vogliamo che sia rappresentato un numero, ovvero positivo o negativo.

    0000 = +0 oppure 1000 = -0 oppure +8 oppure -8
    0001 = +1 oppure 1001 = -1 oppure +9 oppure -9
    0010 = +2 oppure 1010 = -2 oppure +10 oppure -10
    0011 = +3 oppure 1011 = -3 oppure +11 oppure -11
    0100 = +4 oppure 1100 = -4 oppure +12 oppure -12
    0101 = +5 oppure 1101 = -5 oppure +13 oppure -13
    0110 = +6 oppure 1110 = -6 oppure +14 oppure -14
    0111 = +7 oppure 1111 = -7 oppure +15 oppure -15

    ...........quindi con x86 ,con solo 15 combinazioni possiamo rappresentare 30 numeri, e tanti che lo chiamano winzoz...........

    tu comunque non ti devi preoccupare, per te ti compila tutto il tuo compilatore preferito......... basta che gli dici int short o double o ancora meglio float scomodando i8087 l'fpu e sei a posto
    ......... stai tranquillo!!

    ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.