🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
5 messages
5 total messages Started by przemo12146 Tue, 20 Jul 2010 11:35
Segment
#2342
Author: przemo12146
Date: Tue, 20 Jul 2010 11:35
26 lines
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
#2343
Author: Bogdan (bogdro)
Date: Tue, 20 Jul 2010 15:58
68 lines
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
#2344
Author: przemo12146
Date: Tue, 20 Jul 2010 17:04
21 lines
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
#2345
Author: Bogdan (bogdro)
Date: Wed, 21 Jul 2010 16:21
70 lines
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
#2346
Author: przemo12146
Date: Wed, 21 Jul 2010 16:42
3 lines
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