Thread View: pl.comp.lang.asm
5 messages
5 total messages
Started by przemo12146
Tue, 20 Jul 2010 11:35
Segment
Author: przemo12146
Date: Tue, 20 Jul 2010 11:35
Date: Tue, 20 Jul 2010 11:35
26 lines
2633 bytes
2633 bytes
J.Duntemann w książce pt.:"Zrozumieć Asembler" pisze, że granica paragrafu znajduje się co 10h oraz, że segment może zaczynać się od każdej granicy paragrafu. 1. Dlaczego granica paragrafu musi zaczynać się akurat co 10h i dlaczego segment musi zaczynać się od każdej granicy paragrafu ? Oprócz tego pisze, że procesory "8086 i 8080 widzą cały megabajt pamięci...i dlatego też może podawać pamięci pełny 20-bitowy adres" oraz "...procesory z rodziny 86..."widzą" jeden megabajt pamięci, to patrzą na niego przez 16-bitowe "przesłony"","Okienko ma długość 65536 bajtów i szerokość jednego bajta.Mikroprocesor może przesuwać tę przesłonę do góry i do dołu po całej pamięci. ...Mikroprocesor ogląda więc pamięć w dość szczególny sposób. Widzi ją tylko w wycinkach nie większych niż 65536 bajtów." 2. Czy skok (tylko czysto teoretycznie) z początku pamięci o adresie 0h aż do końca czyli FFFF0h odbywa się w sposób taki że, segment jest przesuwany co 10h aż do ostatniego adresu (początku ostatniego segmentu) czy może od razu znajduje się na początku ostatniego segmentu (ostatnim adresie), tak jak elektrony krążące wokół jadra atomowego jakiegoś pierwiastka które teoretycznie mogą znajdować się w każdym punkcie o promieniu r (odpowiedź wydaje mi się oczywista skoro skok zajmuje jakiś czas to znaczy że, segment musi się przemieścić z początku do końca przez pozostałe adresy nie zatrzymując się na nich, ale nie jestem pewien.).
Re: Segment
Author: Bogdan (bogdro)
Date: Tue, 20 Jul 2010 15:58
Date: Tue, 20 Jul 2010 15:58
68 lines
4408 bytes
4408 bytes
W dniu 20.07.2010 13:35, przemo12146 pisze: > J.Duntemann w książce pt.:"Zrozumieć Asembler" pisze, że granica > paragrafu znajduje się co 10h oraz, że segment może zaczynać się od > każdej granicy paragrafu. Tak. > 1. Dlaczego granica paragrafu musi zaczynać się akurat co 10h Przyczyna jest prosta: paragraf definiuje się jako 16 (10h) bajtów. A skoro adresy zaczynają się od zera, to granica paragrafu jest co 16 bajtów. > i > dlaczego segment musi zaczynać się od każdej granicy paragrafu ? Adres w trybie 16-bitowym składa się z pary segment:offset, odpowiadający tej parze adres fizyczny otrzymuje się według wzoru: segment*16 + offset. Zauważ więc, że jak zwiększasz numer segmentu o 1, to tak naprawdę zwiększasz adres fizyczny o 16 bajtów, czyli o paragraf. Paragraf to najmniejsza wielkość, o którą możesz się przesunąć, zmieniając numer segmentu. Skoro paragrafy są co 16 bajtów od adresu 0, tym samym segmenty też zaczynają się co 16 bajtów od adresu 0. Poczytaj http://rudy.mif.pg.gda.pl/~bogdro/dos/a_kurs02.htm - tam masz wszystko wyjaśnione. > Oprócz tego pisze, że procesory "8086 i 8080 widzą cały megabajt > pamięci...i dlatego też może podawać pamięci pełny 20-bitowy adres" > oraz "...procesory z rodziny 86..."widzą" jeden megabajt pamięci, to > patrzą na niego przez 16-bitowe "przesłony"","Okienko ma długość 65536 > bajtów i szerokość jednego bajta.Mikroprocesor może przesuwać tę > przesłonę do góry i do dołu po całej pamięci. ...Mikroprocesor ogląda > więc pamięć w dość szczególny sposób. Widzi ją tylko w wycinkach nie > większych niż 65536 bajtów." Tak. Te wycinki nazywają się właśnie segmentami. > 2. Czy skok (tylko czysto teoretycznie) z początku pamięci o adresie > 0h aż do końca czyli FFFF0h odbywa się w sposób taki że, segment jest > przesuwany co 10h aż do ostatniego adresu (początku ostatniego > segmentu) czy może od razu znajduje się na początku ostatniego > segmentu (ostatnim adresie), tak jak elektrony krążące wokół jadra > atomowego jakiegoś pierwiastka które teoretycznie mogą znajdować się w > każdym punkcie o promieniu r (odpowiedź wydaje mi się oczywista skoro > skok zajmuje jakiś czas to znaczy że, segment musi się przemieścić z > początku do końca przez pozostałe adresy nie zatrzymując się na nich, > ale nie jestem pewien.). Od razu znajduje się na końcu. Procesor, widząc instrukcję postaci jmp 0FFFFh:0000h po prostu ładuje 0FFFFh do rejestru segmentu kodu (CS), 0000h do rejestru wskaźnika instrukcji (IP) i od tej pory pobiera instrukcje spod nowego adresu. Tak samo, można ręcznie załadować rejestr CS na odpowiednią wartość "od razu", nie trzeba się przesuwać co 1 segment. Przesuwając się co 10h segmentów, nie da się od segmentu 0 trafić na segment 0FFFF. Przesuwając się co 10h bajtów - tak. Skoki zajmują dużo czasu z wielu przyczyn: trzeba opróżnić na przykład pamięć podręczną, zdekodowany potok instrukcji, wczytać nowe dane z pamięci itd. Czysto teoretycznie rozmawiając, punkt nie ma promienia :) -- Pozdrawiam/Regards - Bogdan (GNU/Linux & FreeDOS) Kurs asemblera x86 (DOS, GNU/Linux):http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 www.JabberPL.org www.TorProject.org Soft (EN): miniurl.pl/bogdro-soft
Re: Segment
Author: przemo12146
Date: Tue, 20 Jul 2010 17:04
Date: Tue, 20 Jul 2010 17:04
21 lines
2395 bytes
2395 bytes
> Czysto teoretycznie rozmawiając, punkt nie ma promienia :) przepraszam za pomyłkę miało być w każdym punkcie ze środka o promieniu r (czysto teoretycznie bo tak naprawdę miejsce w którym może wystąpić elektron wyrażony jest funkcją matematyczną rozkładu gęstości elektronowej w zależności od jądra które jest umieszczone w początku układu współrzędnych to "r" to tylko tak dla uproszczenia). Wracając do tematu jak miałby wyglądać czysto teoretycznie kod który realizuje proste założenie a mianowicie do pierwszego adresu pamięci ładuje wartość 11111111b później wykonywany jest skok pod ostatni adres pamięci i tam wartość zmieniana jest na 11111111b tak jak wyżej, później następuje inkrementacja rejestrów które zawierają adres początkowy następnie wykonywana jest dekrementacja rejestrów które zawierają adres końcowy i znowu pod adres zwiększony i zmniejszony wpisywana jest wartość 11111111b tu chyba przydałaby się jakaś pętla aż do "środka" pamięci gdzie "środkowa" wartość zostaje wyzerowana a program kończy działanie wychodząc. Dziękuje za poprzednią odpowiedź.
Re: Segment
Author: Bogdan (bogdro)
Date: Wed, 21 Jul 2010 16:21
Date: Wed, 21 Jul 2010 16:21
70 lines
3001 bytes
3001 bytes
W dniu 20.07.2010 19:04, przemo12146 pisze: [...] > Wracając do tematu jak miałby wyglądać czysto teoretycznie kod który > realizuje proste założenie a mianowicie do pierwszego adresu pamięci > ładuje wartość 11111111b mov ax, 0 ; lub "xor ax, ax" mov ds, ax mov byte [ds:0], 0FFh > później wykonywany jest skok pod ostatni > adres pamięci i tam wartość zmieniana jest na 11111111b tak jak wyżej, Mówisz: "skok". Chcesz najpierw skoczyć pod ostatni adres, po czym zmieniać kod, który tam akurat jest? Jeśli mówisz po prostu o zmianie danych pod tym "ostatnim adresem", bez skakania (przenoszenia działania programu pod inny adres), to wystarczy takie coś: mov ax, 0FFFFh mov ds, ax mov byte [ds:0FFFFh], 0FFh > później następuje inkrementacja rejestrów które zawierają adres > początkowy następnie wykonywana jest dekrementacja rejestrów które > zawierają adres końcowy i znowu pod adres zwiększony i zmniejszony > wpisywana jest wartość 11111111b tu chyba przydałaby się jakaś pętla > aż do "środka" pamięci gdzie "środkowa" wartość zostaje wyzerowana a > program kończy działanie wychodząc. Mówisz o czymś w postaci poniższego kodu? mov ax, 0 ; lub "xor ax, ax" mov ds, ax mov byte [ds:1], 0FFh mov ax, 0FFFFh mov ds, ax mov byte [ds:0FFFEh], 0FFh Można oczywiście, jak najbardziej używać rejestrów zamiast sztywnych offsetów, np. mov ax, 0 mov ds, ax mov ax, 0FFFFh mov es, ax mov bx, 0 mov byte [ds:bx], 0FFh mov bx, 1 mov byte [ds:bx], 0FFh [itd...] mov si, 0FFFFh mov byte [es:si], 0FFh mov si, 0FFFEh mov byte [es:si], 0FFh [itd...] -- Pozdrawiam/Regards - Bogdan (GNU/Linux & FreeDOS) Kurs asemblera x86 (DOS, GNU/Linux):http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 www.JabberPL.org www.TorProject.org Soft (EN): miniurl.pl/bogdro-soft
Re: Segment
Author: przemo12146
Date: Wed, 21 Jul 2010 16:42
Date: Wed, 21 Jul 2010 16:42
3 lines
1403 bytes
1403 bytes
Właśnie o to mi chodziło. Jeszcze raz dziękuje za odpowiedź.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads