![]() |
| | #1 (permalink) | ||
| Registered User Join Date: Aug 2006 | Assembly n00b
Sal'! De curand m-am apucat sa invat Assembly si parerea mea e ca e foarte greu . Am cumparat o carte de la Teora, ii zice "Programarea in Limbaj de asamblare" scrisa de Vasile Lungu si am cateva nelamuriri...Orice element dintr-un segment din memorie este disponibil printr-o adresa logica segmentata care contine un selector (folosit ca un index pentru a selecta descriptorul corespunzator din tabela descriptorilor) si deplasamentul (offset-ul) care specifica adresa exacta a elementului selectat fata de offsetul 0. Ce face in fact aceasta adresa logica segmentat (adresa care, presupun ca estemapata peste memoria fizica) si ce este acel presupus element? Thanks. | ||
|
| | #3 (permalink) | ||
|
Problema este ca ai pus intrebarea la fel ca in carte dci nu am inteles mai nimic din trebare . Incearca sa folosesti termenii din egleza .Elementul este de fapt si de drept o adresa de memorie sau mai bine zis o locatie fizica din memorie, adresa logica segmentata, traducere made by Vasilica Lupica (hate catile de la Teora), este adresa unei locatii de memorie de forma xxxxxx:yyyyyy unde sirul de x este adresa de start a blocului de memorie sau stiva de memorie a programului si sirul de y este offsetul adica cu cat se deplaseaza adresa de memorie spre dreapta pentru a afla adresa de memorie a informatiei cautate. In ASM se stie adresa de start a stivei adresa care din ce imi aduc aminte se poate afla deoarece la inceputul unui program in ASM se rezerva memorie z, fiecare dupa plac, gust, necesitati. Nu sunt sigur dar parca aceiasi carte o am si eu numai ca in afara de cartea respectiva am aruncat ochii si pe diferite surse ASM de virusi si chiar una bucata soft facut in Pascal si imi scapa cuvantu' a fost dezasamblat .
__________________ James "Hitman" Wolf, Lieutenant JG Armed Forces of the Federated Suns, House Davion, Davion Brigade of Guards, First Davion Guards, New Avalon, NAIS College of Military Science "For Victor, for Federated Suns" | |||
|
| | #4 (permalink) | ||
| Registered User Join Date: Nov 2001 |
ufff...assembler.... era o data ca niciodata, ca daca n-ar fi fost nu s-ar fi povestit, o chestie numita procesor (si avea registrii) si inca o chestie numita memorie. si procesorul accesa celule din memorie, pe baza adreselor lor. ca sa fiu mai clar si sa nu ma apuc sa fac calcule, presupunem ca registrii erau pe 2 biti si memoria avea 4 celule. adica procesorul putea accesa celulele 00, 01, 10, 11, intrucat adresa de memorie era scrisa intr-un registru(care nu putea mai mult de 2 biti. asa era el, slab si prost, nu tinea minte mai mult). timpul a trecut, memoria a crescut intr-un an cat procesorul in 3 si programatorii au descoperit ca au la dispozitie 16 celule de memorie, dar nu pot accesa decat 4(intruct registrii au ramas mici). asa ca s-au gandit ei sa acceseze memoria folosind 2 registrii. mai precis, au impartit cele 16 celule in 4 grupe de cate 4 celule, apoi au scris in primul registru numarul grupei si in al 2-lea registrul, adresa celulei din cadrul grupului. si asa celula a 3-a a fost accesata prin 00:10 (adica grupul 0, celula 3), iar celula a 5-a a fost accesata prin 01:00(grupul 1, prima celula) si celula a 12-a a fost accesata prin 10:11(grupul 3, celula 4). Asa ca adresa fizica a unei celule de memorie definita prin xx:yy se calcula cam asa: xx * 4 + yy. 4 ala provine din nr de valori ce incap intr-un registru. PS:unde am scris xx:yy, am scris in binar. deci 11:10 inseamna 3:2 in zecimal. si am mai aplicat notatia din C, adica primul indice e 0, nu 1. d'aia 00:10 inseamna grupul 0, a 3-a celula(primele 2 sunt 00, respectiv 01). PS2:in realitate, procesoarele au fost pe 8, 16, 32 biti etc (cele pe 2 biti nu le-am prins )
__________________ Who forgot to close the gate? Who let me out? | ||
|
| | #5 (permalink) | ||
|
Real mode (adica DOS): Quote:
Protected mode (adica orice OS din ultimii 10 ani): Quote:
Toate detaliile tehnice aici. Citeste de la sectiunea 3.4.2 la 3.4.5 (inclusiv). Daca nu intelegi, ia-ti alta carte despre ASM.
__________________ Scarbit de fapta ta cea rea Degeaba plangi, acum, copile, Ci du-te'n casa-acum si zi-le Parintilor, isprava ta. | |||
|
| | #6 (permalink) | ||
|
E oarecum simplu. Din punctul de vedere al programului tau, tu ai aces la niste portiuni de memorie liniare numite "segmente" de memorie. O portiune de exemplu va contine date de un anumit tip, alta codul programului, ar putea contine functii de sistem, etc.. Fiecare segment incepe cu adresa 0 si are o anumita lungime, numarul unui byte in segmentul respectiv se numeste offset. Poti incerca sa acesezi memorie peste lungimea segementului dar vei primi o eroare. Deci pentru a accesa un byte din memorie, poti scrie/citii de la o adresa de forma x:y unde x e numarul segmentului ("selector" intr-un tabel unde se zic chestii de gen dimensiune, daca te lasa sistemul de operare sa scrii sau citesti in el, etc.. ), si y e numarul byte-ului in segment. Fiecare program are propria sa structura de segmente, nu exista o corespondenta directa cu o zona din memoria fizica - un segment poate reprezenta un fisier de pe hardisk care va fi citit de sistemul de operare cand incerci sa accesezi date, sau poate reprezenta date din memoria video sau pentru un alt device. Restul e gargara care tine de arhitectura calcualtorului si pe tine nu te intereseaza in mod normal.
__________________ Linux is free only if your time is worthless. | |||
|
| Advertisment | |
![]() |
|
| Thread Tools | |
|
|