PDA

Visualizza la versione completa : [Assembler] quantità di memoria???


Pancarone
09-12-2003, 08:39
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!!!!...

scancode
09-12-2003, 12:44
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............

Pancarone
10-12-2003, 09:25
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????

scancode
10-12-2003, 11:39
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

Pancarone
10-12-2003, 12:29
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?????

scancode
10-12-2003, 13:54
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!!!!!!!

Pancarone
10-12-2003, 14:12
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!!!

scancode
10-12-2003, 16:35
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 :offset
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

alka
10-12-2003, 18:01
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.

Pancarone
10-12-2003, 18:33
è in formato pdf mo te lo invio via posta alka ok?

Loading