[x64] operand size/memory size?

0
  1. jaka jest roznica miedzy pojeciem operand i memory?
    w rozdziale 3.6 pisza o tym, ale nie jest wyjasniona roznica.

jak odwoluje sie do pamieci, np mov eax,[0x00112233] to uzywam tu operand size czy memory size?
CS.D okresla w ia32 wielkosc adresu, 0 = 16, 1 = 32. prefix 66/67 moze to odwrocic.
ale jaka jest roznica? kiedy korzystam z operand size, a kiedy memory size?

  1. w ia32e jak wyglada dostep do 64 bitow pamieci?
    instrukcja ma max 15 bajtow, a zakodowanie imm64+disp64 zajelo by 16 bajtow.
    np mov qword [0x1122334455667788],0x1122334455667788.

  2. co to sa rejestry sil, dil, bpl, spl?
    czy ia32e dodaje dostep do najnizszych czesci reejstrow rsi, rdi, rsp, i rbp? czy moze to jest cos innego?

0

Ja pierniczę, durny abuserze, od trzech laty czy nawet więcej nie potrafisz nauczyć się korzystania z dokumentacji... Manuale wszystko pięknie tłumaczą, tylko nie można być byle tłukiem co nie umie czytać ze zrozumieniem i uważa, że pierwszym źródłem informacji jest forum dyskusyjne (nawiązując do skasowanych postów z forum fasma).

0
asm55 napisał(a)

w rozdziale 3.6

W rozdziale 3.6 czego?

jak odwoluje sie do pamieci, np mov eax,[0x00112233] to uzywam tu operand size czy memory size?
CS.D okresla w ia32 wielkosc adresu, 0 = 16, 1 = 32. prefix 66/67 moze to odwrocic.
ale jaka jest roznica? kiedy korzystam z operand size, a kiedy memory size?

Operand size dotyczy rejestru eax (a więc są 32 bity) a memory czy address size dotyczy adresu, czyli 0x00112233.

instrukcja ma max 15 bajtow, a zakodowanie imm64+disp64 zajelo by 16 bajtow.
np mov qword [0x1122334455667788],0x1122334455667788.

Taka instrukcja jest niedozwolona, musisz przenosić poprzez rejestr:

  mov rax,0x1122334455667788
  mov [qword 0x1122334455667788],rax
  1. co to sa rejestry sil, dil, bpl, spl?

Dolne 8 bitów rejestrów si,di,bp, sp.

czy ia32e dodaje dostep do najnizszych czesci reejstrow rsi, rdi, rsp, i rbp?

Tak.

0

operand size - rejestr
address size - pamiec

cpu moze dzialac w 2 trybach:

long mode, i legacy mode.
jezeli nie ma supportu dla long mode, legacy mode jest jedynym trybem.

legacy mode to pro-mode, v8086, i real mode.
long mode to 64bit native, i compatibilty mode.

compatibility mode jest wykozystywane np w windowsie by uruchamiac programy pisane opd 32 bitowe systemy. do przelacznika stosuje sie CS.L (bit w selektorze). 1 = long mode, - = legacy mode.

operand override powoduje zmiane wielkosci rejestru. wiecej niz 1 prefix sa ignorowane.
long mode - native = 32bit operand size by default. prefix = 16 bit. rex.w = 64 bit.
jak rex.w jest = 1 operand prefix jest ignorowany.
CS.D ignorowany /reserved/.
long mode dodaje nowe rejestry oraz umozliwia dostep do najnizszych bajtow kazdego rejestru.

comaptibility mode -
rex nie istnieje.
cs.d = 1 - 32bit default, 0 - 16 bit.
operand size overrize odwraca rozmiar cd.d

a jak jest z adresowaniem w ia32e?
dlaczego nie moge miec w operandzie 8 bajtow offsetu? z czego to wynika?
trzymaja sie maxymalnej wielkosci instrukcji czy co? mysle ze mogli by ja powiekszyc bez niszczenia backward-compatibility.

[/b]i na co jest 'canonical form'? mi wyglada to na analogiczny idiotyzm jak stos rosnacy w dol...
tylko 48 bitow, 48 sign-extended do 64...
co daje tylko 256TB w obie strony... a co z reszta? znow za 10 lat beda wprowadzali nowe segmenty zeby zaadresowac cala pamiec?
a moze przywroca funkcjonalnosc selektorom z ktorych zrezygnowali? czekam na wyjasnienia.
w prawdzie mozna podac adres w rejestrze, no ale po co. jak bede robil skok do dynamicznie alokowanej pamieci, to rownie dobrze mogli by wyeliminowac JCC immXX, bo tak czy inaczej bede musial podac rejestr.[/b]

manuale intela sa dobrym zrodlem informacji, ale dla kogos kto ma duze doswiadczenie w tym.
oni juz od poczatku zakladaja ze ja wiem wszystko, nie tlumaczac prawie niczego.
fakt ze rozumiem wszystko, ale detale dopiero nabywam jak polacze swoja wiedze i to co w manualu.
ktos powinien je przepisac, dodac wiecej linkow, i zmienic ten cholerny spis tresci bo nic nie mozna znalezc...

0

a jak jest z adresowaniem w ia32e?
dlaczego nie moge miec w operandzie 8 bajtow offsetu? z czego to wynika?

Nie wiem. Ale jest jeszcze śmieszniej:

to przejdzie

mov qword rax,[qword 1122334455667788h]

a to już nie

mov qword rbx,[qword 1122334455667788h]

I jak to się ma do 32-bitowych ofsetów, których można używać z każdym rejestrem?

mov qword rax,[dword 11223344h]
mov qword rbx,[dword 11223344h]

tylko 48 bitow, 48 sign-extended do 64...
co daje tylko 256TB w obie strony... a co z reszta?

„256 TB pamięci powinno wystarczyć każdemu” :-]
A tak serio, to adresy kanoniczne zostały wprowadzone właśnie po to, by umożliwić późniejsze rozszerzenie przestrzeni adresowej nawet do pełnych 64 bitów. Dzięki temu system operacyjny i programy nie mogą sobie w nieużywanych obecnie bitach umieszczać żadnych flag, oraz zawsze wiadomo, gdzie jest połowa przestrzeni adresowej (właśnie w połowie).

a moze przywroca funkcjonalnosc selektorom z ktorych zrezygnowali?

Tym właśnie spowodowali niezły bałagan: mamy teraz kupę pól i rejestrów oznaczonych jako "zarezerwowane". Ale tak po prawdzie, dzisiejsze 32-bitowe systemy wcale ich tak w pełni nie wykorzystują. Choć przecież mogłyby.

manuale intela sa dobrym zrodlem informacji, ale dla kogos kto ma duze doswiadczenie w tym.

Polecam manuale AMD. Są pisane mniej patetycznym stylem, a zawierają przecież siłą rzeczy tę samą treść. No i „lepiej się znają” bo w końcu to AMD wymyśliło x86-64 a nie Intel /więc to na AMD trzeba zwalać winę jeśli coś jest nielogiczne ;-)/

0

to przejdzie
mov qword rax,[qword 1122334455667788h]

nie przejdzie. modRM nie moze adresowac displacemenut 64 bitowego.

I jak to się ma do 32-bitowych ofsetów, których można używać z każdym rejestrem?
mov qword rax,[dword 11223344h]
mov qword rbx,[dword 11223344h]

to dziala normalnie, modrm = 00XX X100
REX zmienia rozmiar z 32bitowego na 64bitowy. defaultowo idzie 32 bitowy.

A tak serio, to adresy kanoniczne zostały wprowadzone właśnie po to, by umożliwić późniejsze rozszerzenie przestrzeni adresowej nawet do pełnych 64 bitów. Dzięki temu system operacyjny i programy nie mogą sobie w nieużywanych obecnie bitach umieszczać żadnych flag, oraz zawsze wiadomo, gdzie jest połowa przestrzeni adresowej (właśnie w połowie).

co ma polowa do tego?

jak RIP bedzie pod 0x4000000000000000
to dupa, odwolasz sie tylko do 0x40000F0000000000 - 0x3FFFFFF000000000 czy cos kolo teog nie chce mi sie liczyc.
wiec petle bedzie trzeba robic na okolo, ehh...

0

wracajac do adresowania portow.

wiem juz ze cpu obsluguje 2 przestrzenie adresow przez pin M.
jedna jest 2^16 zarezerwowana dla portow, a druga dla memory mapped devices jak RAM czy pamiec graficzna.

teraz chce znac wiecej szczegolow.

glownie interesuje mnie MTRR. w manualu nie moge sie doszukac.
zalozmy ze chce wylistowac wszsytkie porty w port i/o. jak to uczynic?

czy jest jakas regule, ze ten offset to apic, ten pic, tamet to cos innego?

0
asm7 napisał(a)

to przejdzie
mov qword rax,[qword 1122334455667788h]

nie przejdzie. modRM nie moze adresowac displacemenut 64 bitowego.

Przed wydawaniem osądów proponuję sprawdzić. Zwłaszcza że wyraźnie pokazałem, że tylko dla rejestru RAX (oraz EAX, AX, AL) taka instrukcja istnieje.

wiec petle bedzie trzeba robic na okolo, ehh...

Nie rozumiem, jakie pętle chcesz robić na około. Poza tym, to nie jest jak "stos w drugą stronę", bo żadne adresy nie idą w dół. Są po prostu dwa obszary pamięci - z wielką dziurą pomiędzy.

0

czy jest jakas regule, ze ten offset to apic, ten pic, tamet to cos innego?

Nie ma ścisłej reguły. Część najważniejszych portów jest przypisana na sztywno, zdefiniowana jako standard PC. Część natomiast jest konfigurowalna (tzw. Plug and Play) i to system operacyjny (albo BIOS) musi się dogadać z urządzeniem (np. kartą dźwiękową) jakie porty będą urządzeniu przypisane. Ale to już nie moja działka jest :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1