Asembler x86: Różnica pomiędzy 16, a 32 bit

0

Cześć, aktualnie na studiach przerabiamy architekturę komputerów i mamy do napisania pewne programy.

Nie mogę znaleźć informacji o co chodzi z kodem dla 16 a 32 bit.

Wiem, że do rejestrów 16 bitowych tj. AX można wpisać wartość max 16 bitową, a już do EAX 32 bitową, ale jak to się ma do generowanego kodu 16 a 32 bitowego.

W nasm mogę wpisać BITS 16 lub BITS 32 aby generowało odpowiedni kod, ale po co ? Dlaczego i jaki ma to cel ?

Wiem, że dodatkowy opcode dla 32bitowego to 66h, ale jaki jest cel stosowania 32 bitów i kiedy je stosować, czy to wymagana konieczność po przejściu do 32 bitowego trybu chronionego ?

Proszę o pomoc, bo nie mogę sobie tego w głowie jakoś poukładać, a czytałem już sporo o tym i coś nie tak ;)

0

32-bitowe x86 to np:

  • rzędy wielkości większa przestrzeń adresowa,
  • inne mechanizmy ochrony pamięci,
  • stronicowanie,
  • pamięć wirtualna,
  • itp itd

Jeśli chodzi o sam kod, to właśnie główna różnica jest taka, że w 32-bitowych x86 są dodatkowo dostępne 32-bitowe rejestry i nimi się adresuje.

0
Wibowit napisał(a):

32-bitowe x86 to np:

  • rzędy wielkości większa przestrzeń adresowa,
  • inne mechanizmy ochrony pamięci,
  • stronicowanie,
  • pamięć wirtualna,
  • itp itd

Jeśli chodzi o sam kod, to właśnie główna różnica jest taka, że w 32-bitowych x86 są dodatkowo dostępne 32-bitowe rejestry i nimi się adresuje.

Ale jak to się ma do 16 i 32 bitowych rozkazów ? Bo te 32 bitowe mają dodatkowy opcode 66h.

Czy rozkazy 32 bitowe tj. mov, cmp, jmp (z dodatkowym opcode 66h) sa używane dopiero po przełączeniu na 32 bitowy chroniony ?

Co jeżeli w 16 bitowym będe używać rejestrów 32 bitowych ? (taki kod jest kompilowany ale nie mam jak przetestować) ?

Jaka jest podstawowa różnica w trybie chronionym 16 i 32 bitowym ?

0

Prefix 66h działa tak, że w trybie 16-bitowym zamienia rejestry 16-bitowe na 32-bitowe, a w trybie 32-bitowym zamienia rejestry 32-bitowe na 16-bitowe (tzn zmienia znaczenie prefiksowanych instrukcji).

0

Taka instrukcja:

mov ax, 100

w trybie 16-bitowym zostanie zakodowana tak (piszę z pamięci):

B8 64 00 // opcode, imm16

a w trybach 32- i 64-bitowym tak:

66 B8 64 00 // prefix, opcode, imm16

A taka instrukcja:

mov eax, 100

w trybie 16-bitowym zostanie zakodowana tak:

66 B8 64 00 00 00 // prefix, opcode, imm32

a w trybie 32-bitowym tak:

66 B8 64 00 // opcode, imm32

Prefix 66 zmienia więc bitowość instrukcji.

Co jeżeli w 16 bitowym będe używać rejestrów 32 bitowych ? (taki kod jest kompilowany ale nie mam jak przetestować) ?
Jeśli procesor jest 32 (albo 64) bitowy, to w trybie 16-bitowym spokojnie można używać 32-bitowych rejestrów (jak wyżej). Jeśli procesor jest prawdziwie 16-bitowy (np. 186, Intel produkował go do 2007 roku!) to takie coś wywali wyjątek – nieprawidłowa instrukcja.

EDIT: z jakiegoś powodu parser nie koloruje tego mov eax,100. próbowałem <asm> i <code class="asm">.

0

Po przejściu do protected mode musisz używać 32 bitowego asma, bo to tryb 32 bitowy. 16bit asma używasz w real mode. 0x66 to nie opcode tylko prefix, zmienia wielkość operandów. O budowie instrukcji:

Nie ma trybu chronionego 16 bitowego, z wyjątkiem 286.

@Azarien 0x66 w 16 bitowym kodzie nie zmieni wielkości operandów na 8 bitowe?

0

Po przejściu do protected mode musisz używać 32 bitowego asma, bo to tryb 32 bitowy. 16bit asma używasz w real mode.
Nie koniecznie, nie zawsze i nie tylko...

Nie ma trybu chronionego 16 bitowego, z wyjątkiem 286.
No więc jak nie ma jak jest :-| w krótkim zdaniu sobie zaprzeczyłeś.

w 16 bitowym kodzie nie zmieni wielkości operandów na 8 bitowe?
Nie.

0

Ciekawostka:
Oprócz trybów stricte 16-bitowych lub stricte 32-bitowych, można mieć mieszankę: http://en.wikipedia.org/wiki/Unreal_mode

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