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...
stos i adresy
-
- 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
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
może należy to traktować jako 000008C2h (0000:08c2h = 008c:0002 -> normalizacja).
Byłby to obszar biosu (chyba ROM)
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
Adres adr32 musi być 32-bitowy, a tu masz: 08C2h,CALL adr32 gdzie adr32 to np. 08C2h
może należy to traktować jako 000008C2h (0000:08c2h = 008c:0002 -> normalizacja).
Byłby to obszar biosu (chyba ROM)
-
- Użytkownik
- Posty: 22
- Rejestracja: 23 cze 2005, o 11:43
- Płeć: Mężczyzna
- Lokalizacja: Łódź
- Podziękował: 6 razy
stos i adresy
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.....