Stampare numeri a 32 bit

di il
20 risposte

20 Risposte - Pagina 2

  • Re: Stampare numeri a 32 bit

    P.s.:@oregon
    infatti io suggerisco di non utilizzare lo stack ma di utilizzare una variabile cosi :
    1) si crea uno stack "non convenzionale" imparado che uno stack può essere fatto anche con una variabile e facendo capire uno scopo di utilizzo dello stack.
    2) utilizzando tutti i registri disponibili, se non si vuol far uso di variabili, si crea la necessità di dover trovare un modo per poter liberare qualche registro senza perdere i dati quindi o si ricorre allo stack o alle variabili imparando che bisogna sempre avere qualche registro vuoto in caso di necessità.
    e oltre a quello che si imparava nel punto uno si impara un altro scopo dello stack e cioè quello di conservare i dati in maniera temporanea.
    il fatto di cercare metodologie alternative senza l'utilizzo dello stack fa proprio si che alla fine si arrivi al suo utilizzo.
    sembra strano ma vedere il codice pieno di istruzioni e pieno di variabili fa venire in mente la classica domanda "come ridurre il codice?", sia per fare bellafigura con il docente e sia per non fare la figura del pollo con i colleghi, cosi lo studente pian piano arriva da solo all'uso dello stack utilizzando al meglio perchè ne avrà capito il significato. in poche parole e un piccolo trucco psicologico. mentre se gli dici usa lo stack tendrà a bloccarsi e a usarlo male.
    nel 80% dei casi funziona l'ho sperimentato con ottimi risultati.
    devi guidare non devi dire la strada diretta perchè altrimenti durante il viaggio imparerà meno di quanto può.
    ricordi che io, qundo posso, lascio sempre scegliere cosi do più di una possibilità.
    e ome se dicessi stai a milano devi andare a roma.
    io ti propongo di passare per firenze, perugia e bologna etc etc fai tu.
    chi impara scglierà quella che secondo lui e la strada più consona al suo modo di guidare e imparerà, se ha voglia, tutto o quasi di ciò che quella soluzione gli offre.

    per quanto riguarda gli svantaggi dello stack sono :
    queste sono cose che per noi che le conosciamo sono normali e banali non chè facilmente le preveniamo.
    ma mettiti nei panni di uno che stà imparando gli complica la vita non saperle.

    la perdita di utilizzo generale di 2 registri
    il fatto che se si fa una pop prima di un ret e non c'è una push, giustamente, la ret va "in confusione"
    in un ciclo bisogna stare attenti con push e pop perchè involontareamente lo stack si può sfondare.
    il fatto che bisogna sempre tener presenti il numero di dati nello stack dati.
    il fatto che non ti dicano quando conviene usarlo e quando no. cercano di fartelo capire ma se ti dicono questo esercizio lo devi fare con lo stack " non lo capisci facilmente perchè tenderà solo a far contento il professore. mentre se prova altre strade lo capirà
    ma ce ne sono anche altre di precauzioni da utilizzare.
    e questi sono svantaggi
    di solito l'unica avvertenza che danno e che a ogni push dovrà corrispondere una pop.
    potrai pure non essere d'accordo ci stà!
    spero che tu almeno capisca il discorso che ho fatto.
  • Re: Stampare numeri a 32 bit

    @smalldragon ... guarda ... rimarrai convinto di quello che dici ma, con tutta sincerità, ti posso assicurare che, con frasi come

    "il fatto che se si fa una pop prima di un ret e non c'è una push, giustamente, la ret va "in confusione"

    se fossi stato un mio corsista in uno dei miei corsi C/Assembly non saresti andato lontano ...

    Comunque, ciao e buon lavoro
  • Re: Stampare numeri a 32 bit

    :@oregon ah adesso capisco parecchie cose sei un docente universitario!
    perchè scusa cosa succede nel seguente caso:
    
    call procedura ; normalmente la call si calcola l'indirizzo successivo ad essa salva l'indirizzo calcolato nello stack ed effettua una jmp all'indizizzo richiesto (e non a quello calcolato per intenderci!).
    .....
    ....
    ;all' interno della proc
    proc:
    ....
    ....
    pop eax  
    ret ; 
    normalmente la ret (senza parametri effettua) prima effettua una pop dell'indirizzo, calcolato dalla call, che sta nello stack e poi esegue la jmp all'indirizzo preso dallo stack.
    invece quando la ret ha parametri esempio ret 4 "scarta" i primi 4 byte dello stack utilizzando i registri esp e ebp e poi si comporta come una ret normale.
    adesso se l' indirizzo viene preso prima tramite la pop eax in uno stack protetto si avrà un errore di violazione di stack mentre in uno stack non protetto verrà effettuato una jmp ad un indirizzo non conosciuto.
    e questo quello che io intendevo per confusione!
    lo stesso casino succede se metto la push al posto della pop con l'unica differenza che in uno stack protetto non avrei l'errore di violazione di stack ma potrei avere un altro errore.

    fino a windows xp le cose funzionavano in questo modo almeno per call ret.
    se poi dopo hanno cambiato il meccanismo di call e di ret questa e un altra storia!
    ma non credo l'abbiano fatto!
    comunque umilmente se le cose non stanno così (vicenda call - ret) illuminami su come stanno.
    e poi ci sono una valanga di libri che spiegano questo meccanismo bisognerà correggerli tutti.
    buona giornata e buon lavoro.
  • Re: Stampare numeri a 32 bit

    smalldragon ha scritto:


    sei un docente
    Sono stato un docente (anche se non universitario), adesso sono più "operativo" ... ma non importa ...
    perchè scusa cosa succede nel seguente caso:
    Il caso che descrivi è come se ti dicessi:

    ci sono dei bulloni che reggono la ruota dell'auto ... se svito tutti i bulloni la ruota va "in confusione" e si stacca dal supporto creando un incidente.

    E' *ovvio* che un uso maldestro di un "sistema" (e vale per *qualsiasi* sistema) porta a dei malfunzionamenti, ma questo non vuol dire che è il "sistema" ad essere malfunzionante/inutile.
    E' chi l'ha usato in maniera sbagliata a dover essere sostituito.

    Quindi il problema non è nello stack ma nel programmatore che non sa usarlo.
    fino a windows xp
    Windows non c'entra. Quando parli di questi argomenti sono le CPU (le famiglie di CPU in particolare) e il loro funzionamento che è importante.
    comunque umilmente se le cose non stanno così (vicenda call - ret) illuminami su come stanno. e poi ci sono una valanga di libri che spiegano questo meccanismo bisognerà correggerli tutti.
    Non devi correggere nulla, lascia stare questi discorsi assurdi.
    Devi solamente usare correttamente quello che hai a disposizione.

    Se non scrivi stupidaggini con push/pop non hai problemi.
  • Re: Stampare numeri a 32 bit

    Comunque come noto sei arrivato alle mie stesse conclusioni!
    se i docenti invece di far vedere solo i preggi della struttura/e facessero vedere anche i casini che si possono creare o gli svantaggi i programmi verrebbero scritti meglio e i novizzi imparerebbero meglio ad usare le strutture fondamentali.
    "il fatto che se si fa una pop prima di un ret e non c'è una push, giustamente, la ret va "in confusione"
    se fossi stato un mio corsista in uno dei miei corsi C/Assembly non saresti andato lontano ...
    guarda che se fossi stao un tuo corrsita avrei abbandonato il corso dopo la terza lezione perchè avrei capito che come docente non avresti avuto che insegnarmi.
    almeno per quanto riguarda l'assembler.
    passo e chiudo buon lavoro e buona giornata.
  • Re: Stampare numeri a 32 bit

    smalldragon ha scritto:


    sei arrivato alle mie stesse conclusioni!
    Ma neanche per sogno ...
    ... l'assembler.
    Semmai "l'assembly" ... l'assembler è il programma che compila ... comincia ad imparare questo.

    Va beh ... lasciamo perdere ... non è importante ...
Devi accedere o registrarti per scrivere nel forum
20 risposte