Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [Assembler] quantità di memoria???

    Gente ho un dubbio mostruoso su una cosa banale..........allora se ho una memoria da 512Kbye a parallelismo 8 bit se la voglio riempire completamente e faccio uan mappatura di questa ultima allora l'ultimo indirizzo disponibile in memoria nel quale avrò un 1 quale sarà???.........su un esempio che ho io l'ultimo address si ferma a 20(cioè Address 20) ma scusate 2^20 bite non sono 1048576bite e cioè 131072Byte e cioè128Kbyte??????....e dunque non 512!!!!...

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    305
    Secondo me devi studiare un pò di più..............

    1 megabyte MB 2^20 = 1048576 (byte) -----> e non bit
    1048576*8 = 8388608 bit
    ora che ho 1048576 byte per sapere quanti Kb sono, faccio:
    1048576/1024= 1024 Kb

    Comunque la memoria del pc sia che sia a 8, 16, 32, 64.......
    per far funzionare vecchi programmi a 8 o 16 bit, gli ingegneri della microsoft hanno avuto la geniale idea di lavorare con 1 cella o indirizzo di memoria lasciandolo invariato e cioè a 8 bit.
    Cioò significa che un programma a 16 bit può girare su un pc con architettura 32bit.
    esempio:
    1 cella 8 bit \------------\
    ----------------AX
    2 cella 8 bit /
    --------------------------------EAX 32bit
    3 cella 8 bit \
    ----------------AX
    4 cella 8 bit /------------/

    AX legge 16 bit
    il registro EAX legge 4 celle ovvero 32bit ecc,ecc.

    per questo motivo puoi leggere, lavorando a 16 bit indirizzi lineari a 20 cioè 16+10 ovvero più l'offset
    La memoria viene letta a paragrafi da 64kb = 65536
    i paragrafi sono tanti quanto è la tua memoria installata.


    16 byte = 128 bit rappresento fino a: 16 bit = 65536 + 16 = 1048576 1Mb

    BUS a 20 linee 1111 1111 1111 1111 1111 = FFFFF
    FFFFH:000FH corrisponde all'indirizzo lineare a 20 bit FFFFFH

    In definitiva nel tuo caso ai letto il primo 1 e lultimo 65536 byte
    che è appunto l'ultima cella del paragrafo, dopodichè inizia il paragrafo numero 2 con la cella 1 fino alla cella 65536, poi inizia il paragrafo 3 ...... ec,ecc.
    Quindi i tuoi 512kb non sono letti dalla cella 1 a 524288 byte
    ma 512 sono suddivisi in paragrafi da 65536 byte ciascuno appunto un paragrafo alla volta.
    a 16 bit per indirizzare 1 mb devi usare lo sposramento offset 16+10........mentre a 32bit indirizzi 1 mb in un sol colpo.




    ciao............

  3. #3
    Ok ti ringrazio penso di aver capito però nel mio caso si lavora a 32 bit di indirizzo e 32 bit di dati.........quello che devo fare è indirizzare 4 MB di memoria(avendo a disposizione banchi da 512K).
    Ebbene lo svolgimento dell'esercizio dice che per raggiungere i 4MB richiesti si devono utilizzare 2 blocchi da 4 banchi di memoria ciascuno....dunque in totale 512k x 4 = 4MB,e fin qui ci siamo.
    La cosa che però non capisco è che i primi 4 banchi di memoria li riempie da 0 a 2 MB in questo modo: da 00000000 a 001FFFFF e i rimanenti 4 banchi da 001FFFFF a 003FFFFF.
    Dunque a questo punto non capisco il funzionameto dei paragrafi...se ragiono su un SINGOLO blocco io direi che FISICAMENTE dovrebbero esserci 1048576 celle a dispozizione in quanto da 00000000 a 001FFFFF ho un bel 2^20 di massimo che fa propio 1048576...ebbene tu dici che però nel singolo banco i 512K sono suddivisi in paragrafi da 65356..ma come in che modo non capisco...le celle(con i relativi indirizzi)fisicamente preenti sono o non sono 1048576????

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    305
    digita su google:
    assembler paragrafi...........
    e studiati la configurazione della memoria di un pc......
    i paragrafi sono costituiti da 16 byte = 64k oppure 65536.
    ogni parafrafo è un banco di memoria..... i primi 640
    sono destinati al dos e bios (in assembler puoi lavorare a ring 0 per potervi accedere........
    gli indirizzi 0000000A . in poi sono della memoria video (grafica ecc,ecc)
    ....
    lavorando a 32bit indirizzi i quattro mb (ricordi in un sol colpo)
    in quanto 65536*65536=4294967296, mentre a 16bit, devi lavorare con scostamento offset per indirazzare 1mb
    65536+10h
    indirizzo 0000 scostamento offset 0000

    studia..e poi ne riparliamo


    un buon tutorial è su spazioinwind http://spazioinwind.libero.it/ramsoft/

    ciao

  5. #5
    Ti RINGRAZIO per il link davvero un'ottima guida........penso dunque di aver capito che cosa sono i ''paragrafi''....da quelo che ho capito nelle macchine 80x86 1048576byte(1 MByte)di RAM contengono esattamente 65536 paragrafi!...ma allora il mio blocco di Ram da 512Kbyte di RAM dovrebbe contenere la metà di 65536 o sbaglio?

    Inoltre nel mio esempio lavoro con uan macchina pentium che avendo 32bit di data bus e di registri interni non dovrebbe avere bisogno di usare paragrafi nella memoria..o sbaglio?

    Provo a spiegarmi meglio:considero uno dei miei 8 blocchi di RAM che in teoria dovrebbe avere 512Kbye di memoria....allora nell'esercizio mi dice che il primo di questi blocchi ha un indirizzamento(32 bit) che va(FISICAMENTE) da 00000000 a 001FFFFF...duqnue 001FFFFF corrisponde ad indirizzare 2^21 byte ecioè ESATTAMENTE 2 MByte e non 512Kbye!!!!!!......cosa c'entra poi se al suo interno vi sono 2MB/16 paragrafi?????

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    305
    Ti ricordi che ti veniva 128bit alla prima tua domanda???
    non sono altro che 64k
    ......ovvero
    128(1paragrafo)+
    128(1paragrafo)=256+
    128(3paragrafo)+
    128(4paragrafo)=256
    -totale
    512 ...... ma guarda un pò??????? (sono proprio le tue sim)
    il numero che ti sembra sballato non è altro il quarto banco
    da 128(64k)
    ..... in definitiva è come dire che stai lavorando con il registro al che trabocca......
    insomma studia e vedrai che non è difficile.

    ..ci sentiamo a presto
    fammi sapere..sono curioso... perchè anche a me mi si intrecciava il cervello!!!!!!!

  7. #7
    Dunque contiuno a non capire sebbene stia studiando......io ho capito che 1MB di RAM contiene 65536 paragrafi dunque la mia da 512Kbyte non ne dovrebbe contenere al metà?????..coem mai mi dici che è costituita da solo 4 paragrafi(o segmanti che dir si voglia)????.......cioè non HO capito prima mi dici che IL numero dei paragrafi è uguale alla quantità di memoria installata(nel mio caso 512Kbyte),poi ora mi dici che i segmanti sono 4 aIUTTOOOOO sto scoppiando!!!!...scusa ma nel tuo esempio non dovrebbero essere 8 i paragrafi?(8x64Kbyte=512Kbyte).....512Kbyte non bite!!!

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    305
    QUESTO E' IL MIO TUTORIAL di + nin sò!!!!!!!!!!!
    Studialo e cerca di capire da solo, è il mio consiglio migliore come abbiamo fatto tutti.
    Per capire devi far lavorare le tue meningi e applicarti da solo(comunque un giorno), quando qualcuno ti chiederà come il tutto funziona, tu nella tua testa lo sai............., ma lui non capirà se non si applica da solo!!!!!!!!!
    Questa è la programmzione (pensa che ho un amico che dopo 10 anni mi chiede ancora la differenza tra una variabile e una costante ): ):

    TUTORIAL

    MEMORIA RAM

    il programmatore, vede la RAM non come una matrice, ma come un vettore i cui elementi sono le celle
    numerate 0, 1, 2, 3, ...; ad esempio, in un PC dotato di 128 Mb di RAM, la memoria viene vista dai
    programmi come un vettore di 134217728 byte i cui indici sono 0, 1, 2, 3, ..., 134217727
    (ricordiamoci che gli indici partono da 0, per cui l'indice dell'ultimo elemento si ottiene
    sottraendo uno al numero totale di elementi).

    Le celle contengono 8 elementi elettronici, 8 bit

    Cella o indirizzo della ram = 1111 1111 8 bit

    REGISTRI
    1111 1111 1111 1111
    F F F F
    15 15 15 15
    AH AL
    AX
    BUS INDIRIZZI a 20 linee
    AF AE AD AC AB AA A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 A16 A17 A18 A19 A20
    ----------AH---------- | ---------AL----------|
    ----------------------AX ---------------------|
    AL byte meno significativo
    AH byte pi— significativo

    PARAGRAFO = 16 byte
    1 byte = 8 bit rappresento fino al numero 255
    16 byte = 128 bit rappresento fino a: 16 bit = 65536 + 16 = 1048576 1Mb

    BUS a 20 linee 1111 1111 1111 1111 1111 = FFFFF
    FFFFH:000FH corrisponde all'indirizzo lineare a 20 bit FFFFFH

    BLOCCHI o SEGMENTI

    SEG0 0 a 65535 = 1111 1111 1111 1111
    SEG1 16 a 65551 = 1111 1111 1111 1111
    SEG2 32 a 65567 = 1111 1111 1111 1111
    SEG3 48 a 65583 = 1111 1111 1111 1111
    SEG4 64 a 65599 = 1111 1111 1111 1111

    SEG5 80 a 65615 = 1111 1111 1111 1111
    SEG6 96 a 65631 = 1111 1111 1111 1111
    SEG7 112 a 65647 = 1111 1111 1111 1111
    SEG8 128 a 65663 = 1111 1111 1111 1111

    SEG9 144 a 65663 = 1111 1111 1111 1111
    SEG10 160 a 65679 = 1111 1111 1111 1111
    SEG11 176 a 65695 = 1111 1111 1111 1111
    SEG12 192 a 65711 = 1111 1111 1111 1111
    SEG13 208 a 65727 = 1111 1111 1111 1111
    SEG14 224 a 65743 = 1111 1111 1111 1111
    SEG15 240 a 65759 = 1111 1111 1111 1111

    Bene, questi blocchi, che d'ora in poi chiameremo col loro nome, ossia SEGMENTI, nel
    modello base sono sedici, numerati da 0 a 15, alcuni di questi blocchi non sono disponibili
    ai programmi perch‚ vengono monopolizzati da altre parti del computer o dal sistema operativo, per
    esempio il blocco 0 Š usato dal BIOS e dal DOS per i loro affari, mentre i blocchi 10 e 11 sono di
    propriet… della scheda video che li usa per mostrare sullo schermo tutto quello che i programmi
    memorizzano in queste locazioni di memoria, inoltre il blocco 15 Š di propriet… del BIOS e non potete
    neanche scriverci perch‚ Š un blocco di sola lettura. In pratica i blocchi disponibili ai programmi
    sono solo quelli che vanno dal n.1 al n. 9 e neanche completamente

    seg ffset
    21F2:C01E indirizzo logico
    calcolo per indirazzemto fisico
    21F2 * 10 = 21F20 +
    C0E1 =
    -------
    2E001
    Otteniamo cos un indirizzo a 20 bit 1111 1111 1111 1111 1111 ora posso indirizzare 1 Mb
    2^20 = 1048576

    Come abbiamo visto prima i registri dedicati a contenere il valore del segmento sono CS,DS,ES e SS
    (sono registri a 16 bit).
    Un segmento Š lungo 64Kb, perchŠ l'offset (ad es. specificato in BX) Š lungo 16 bit; ogni valore
    di CS,DS,ES,SS individua un segmento; dentro ogni segmento posso indirizzare quindi 2^16 byte=64 Kb
    di memoria. Noto ancora che i segmenti sono sovrapposti, con un nuovo segmento che inizia ogni 16 byte
    di memoria che corrisponde ad un paragrafo, ad Š appunto per questo che pur usando indirizzi a 32bit si
    pu• indirizzare solo 1 MB

    INFATTI
    --------------------------------------------------
    0 cella di memoria = 1111 1111 = 255 AH \
    = AX 65535 \
    1 cella di memoria = 1111 1111 = 255 AL / \
    = EAX = 4 Gb = 4294836225
    2 cella di memoria = 1111 1111 = 255 AH \ /
    = AX 65535 /
    3 cella di memoria = 1111 1111 = 255 AL /








    ciao

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,310

    Esercizio completo

    Siccome il problema ha intrippato anche me, se fossi in Pancarone posterei il testo completo dell'esercizio, onde evitare che alcuni dei dati riportati siano frutto di riflessioni parziali o di errori.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  10. #10
    è in formato pdf mo te lo invio via posta alka ok?

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.