stos i adresy

fishman4
Użytkownik
Użytkownik
Posty: 22
Rejestracja: 23 cze 2005, o 11:43
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 6 razy

stos i adresy

Post autor: fishman4 »

wlasciwie to pewnie mnie wyklniecie za ten temat ale normalnie nie wiem gdzie szukac pomocy a jako aktywny uzytkownik forum wiem ze tu ja moge znalezc (dobra dosyc wazeliny). moj problem nie jest bezposrednio zwiazany z assemblerem ale raczej z dzialaniem procesora.


Przedstawić co będzie na stosie i jakie będą rejestry jeśli został wykonany dlaeki rozkaz powrotu z podprogramu RET, jeśli CS=4000h, IP=0750h,AX=0120h, Sp=0020h,
M[SP]=80h,M[Sp+1]=20h,M[SP+2]=00h,M[SP+3]=42h,M[SP+4]=0Ah.

mysle ze to bedzie:
CS=4200h
IP=2080h
AX=0120h
SP=0060h

na stosie pozostanie 0Ah


drugie zadanko
Adres pewnej komórki w segmencie danych pamięci operacyjnej przedstawiony jest w postaci dwuczłonowej 0840h:0145h. Przyjmijmy, że przesuwamy początek segmentu danych o 8KB w kierunku niższych adresów. Jaki będzie dwuczłonowy adres naszej komórki po takim przesunięciu? Podać uzasadnienie.

mi wyszlo 0640h:2145h. dobrze?


chodzi mi o to zeby sie ktos wypowiedzial na temat poprawnosci moich odpowiedzi...


i jeszcze jak mam instrukcje CALL adr32 gdzie adr32 to np. 08C2h to odkladam na stosie stare CS i IP, jako nowy CS przy CALL powinienem przyjac czesc segmentowa wywolanego adresu a jako IP jego offset tylko ze w powyzszym przypadku adr32 ma tylko czesc segmentowa wiec co bedzie IP?


szczegolnie wazne jest dla mnie drugie i wyjasnienie tych watpliwosci co do trzeciego...
Fibik
Użytkownik
Użytkownik
Posty: 971
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 75 razy

stos i adresy

Post autor: Fibik »

Mówisz o 16 bitowych programikach.
Pamięć jest tam podzielona na segmenty o wielkośći 64KB,
adresy obliczamy wg wzoru:
linear = seg*16 + offs; seg i offs - 16 bit

w drugą stronę:
seg = linear div 16;
offs = linear mod 16;
--------

8KB = 2000h
seg - 2000h/10H, offs + 2000h
wyliczyłeś dobrze - 0640h:2145h
CALL adr32 gdzie adr32 to np. 08C2h
Adres adr32 musi być 32-bitowy, a tu masz: 08C2h,
może należy to traktować jako 000008C2h (0000:08c2h = 008c:0002 -> normalizacja).
Byłby to obszar biosu (chyba ROM)
fishman4
Użytkownik
Użytkownik
Posty: 22
Rejestracja: 23 cze 2005, o 11:43
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 6 razy

stos i adresy

Post autor: fishman4 »

i problem jest z tym ze przez to nie zaliczylem kolokwium bo nasz mily pan od architektury robi zadania w ktorych nie wiadomo o co chodzi..... a jakby zapisac ten adres na 20 bitach i sobie jakos rozlzyc (random() ) na segment i offset? ale to chyba glupie jest.....
ODPOWIEDZ