Czy BX jest bazowym rejestrem adresów, a jeśli tak, to dlaczego?

Widziałem wiele postów na BX. Myślę, że dzisiaj jest to „Rejestr ogólnego przeznaczenia”. Nie wiem, dlaczego ludzie nazywają to rejestrem adresów bazowych,

  • Dlaczego historycznie nazywa się to rejestrem adresów bazowych.
  • Czy coś z tego jest nadal aktualne ?
  • Czy istnieje konwencja zastrzegająca jego użycie do adresowania bazowego?

Możesz to zobaczyć nazywamy to tutaj .

Komentarze

  • Skoro o tym mowa, to nie jest ' t jest dokładnie pytaniem RC, ponieważ nie ' nie dotyczy niczego związanego ze starym komputerem – zwłaszcza, że prosi o trafność dzisiaj . To pytanie byłoby lepiej dopasowane na głównej stronie SE – a szybkie wyszukiwanie pokazuje, że często zadawano tam różne pytania.
  • Myślę, że kluczem tutaj jest to, że rejestry na x86 są tylko ” mniej lub bardziej ogólnego przeznaczenia „, możesz użyć dowolnego z nich w podstawowych operacjach, ale są / były sytuacje, w których byłeś ograniczony co do rejestrów, które możesz se.
  • Inną kluczową kwestią jest to, że porównanie użycia historycznego i współczesnego jest mylące, jeśli chodzi o x86 (zakładam, że komentarz dotyczący „rejestru ogólnego przeznaczenia” naprawdę odnosi się raczej do EBX / RBX niż BX). Obecny x86 jest wstecznie kompatybilny z 8086, ale współczesne programowanie w języku asemblerowym x86 bardzo różni się od programowania 8086 (a nawet programowania 386); więc użycie BX niekoniecznie mówi wiele o używaniu EBX / RBX.

Odpowiedź

BX zawsze był jednym z rejestrów ogólnych i zawsze był nazywany rejestrem bazowym (patrz na przykład 8086 Primer , strona 19). Jest to rejestr bazowy, ponieważ może być używany w różnych bazowych trybach adresowania: przechowywanie adresu w BX i przesunięcie w SI lub DI (odpowiednio rejestry indeksu źródłowego i docelowego), umożliwia dostęp do pamięci w BX + SI lub BX + DI ( ibid , strona 31) lub BX + SI + natychmiastowe , a nawet BX + natychmiastowe . Służy również jako podstawa dla XLAT.

BP jest podobny i obsługuje wszystkie powyższe tryby adresowania. Różnica między BX i BP polega na tym, że BX domyślnie przyjmuje segment danych (DS), podczas gdy BP domyślnie przyjmuje segment stosu (SS). (BX i BP również mają swoje własne instrukcje – np. XLAT używa BX, ENTER i LEAVE używają BP.)

Te tryby adresowania nadal istnieją dzisiaj, więc ich użycie jest nadal aktualne, ale indeksowane i pośrednie adresowanie są dostępne z dowolnym rejestrem ogólnym, wskaźnikowym lub indeksowym, począwszy od 32-bitowego x86 . Podczas gdy BX i BP są „specjalne” na 16-bitowym x86, ponieważ są jedynymi rejestrami, w których możliwe jest adresowanie pośrednie lub indeksowane, to nie ma już miejsca w przypadku 32- lub 64-bitowych x86, więc EBX, EBP, RBX , a RBP nie są tak wyjątkowe. (BP, EBP i RBP są nadal nieco szczególne, ponieważ wybierają SS jako rejestr bazowy w trybie 16- i 32-bitowym i nie mogą być używane jako wskaźniki bez przesunięcia, tj. zamiast kodu operacji MOV AX, [BP] i MOV AX, [BP+0] nie jest używany.)

Nie ma żadnej konwencji, którą znam lub specjalnie zastrzec używanie BX do adresowania bazowego; jeśli potrzebujesz go użyć do adresowania bazowego, skonfiguruj go odpowiednio i użyj go. Jeśli używana konwencja wywoływania wymaga zachowania BX, musisz się upewnić, że bierzesz to pod uwagę (jako dzwoniący lub odbierający w zależności od konwencji i kodu, który piszesz).

Komentarze

  • +2, aby dodać XLAT / ENTER / LEAVE.

Odpowiedź

(Jest to dodatek do odpowiedzi Stephena Kittsa)

Dlaczego historycznie nazywa się to rejestrem adresów bazowych.

Cóż, tak nie jest. Gdyby tak było, to byłby to „indeks bazowy” (lub lepiej podstawa indeksu), ponieważ w pierwotnym adresowaniu 16-bitowym był jedynym rejestrem, który można dodać jako „podstawę” we wszystkich adresowaniach indeksowanych. Zindeksowane za pomocą SI lub DI. (* 1)

To adresowanie było symetryczne z BP jako wskaźnikiem podstawowym. Podstawowym pomysłem było to, że tablica może być wskazywana za pomocą BX i adresowana przez SI lub DI bez dalszych ceregieli – lub BP, gdy znajduje się w stos (* 2)

Poza tym jest to jeden z oryginalnych dwubajtowych rejestrów ogólnego przeznaczenia.

Czy któryś z tych nadal aktualne?

Niezupełnie. Przynajmniej nie w trybie 32/64 bitowym.Adresowanie REX pozwala na użycie dowolnego rejestru „klasycznego” jako podstawy (indeksu) w trybie 32-bitowym – z wyjątkiem BP / SP (* 3). W trybie 64-bitowym 12 z 16 rejestrów może być używanych w ten sam sposób (nie BP / SP / R12 / R13 (* 4)).

Powiedziawszy to, pojawia się tryb „długi” z 16-bitowymi segmentami kodu trybu chronionego . Tutaj klasyczne (16-bitowe) kodowanie jest używane razem z rozmiarem rejestru 32/64 bitów. BX zachowuje zalety kodowania, ponieważ SIB nie jest potrzebne. Jak bardzo ten raczej zapomniany tryb jest istotny, jest przedmiotem dyskusji.

Czy istnieje konwencja zastrzegająca jego użycie do adresowania bazowego?

Niezupełnie. Użyj w razie potrzeby. W końcu to jest Assembly – nie ma konwencji, której nie chcesz :))

Jedyną kwestią, o której należy pamiętać, jest zachowanie jej dla wywołującego (chyba, że wyraźnie tego nie zrobiono)

Tutaj możesz zobaczyć, jak to się nazywa.

Err … powiedz, że nie myli się, ale polecam poszukanie bardziej szczegółowego opisu, aby dowiedzieć się o x86 (sprawdź Wiki (książki) lub OSDEV-Wiki ). Lub jeśli jest specyficzny dla klasycznego (16-bitowego) programowania x86, to do przeczytania jest tylko jedna książka: Steve Morse „ 8086 Primer . 32/64 Bit jest i tak inny i trzeba się go nauczyć bez tych klasycznych założeń, aby był naprawdę przydatny zamiast plecaka specjalnych przypadków w specjalnych przypadkach.


* 1 – Jeśli chcesz przypisać mnemonik nazwy do 4 podstawowych rejestrów dwubajtowych, może to być

  • AX = A ccumulator . Używany do A rithmetic (lub A zawsze najkrótsze kodowanie)
  • BX = B ase. Używany jako wskaźnik do danych (struktur)
  • CX = C ounter. Używane w operacjach shift / rotate, string ops i loop.
  • DX = D ata. Używany w arytmetyce i we / wy.

* 2 – Z drugiej strony, w przypadku „standardowego” programowania, BP przechowuje ramkę stosu, więc indeks tutaj jest zawsze indeksem do tej ramki, chyba że BP zostanie tymczasowo przeniesiony.

* 3 – SP może być również używany z SIB.

* 4 – SP / R12 ponownie z SIB.

Komentarze

  • REX addressing allows [using any register in 32-bit mode] – czy chodziło Ci o SIB tutaj?
  • @ilkkachu Nie. Przynajmniej nie o ile pamiętam. REX pozwala na użycie trybu r / m dla wszystkich rejestrów. SIB jest potrzebne tylko dla SP i R12. I oczywiście, jeśli chcesz użyć skalowania … czy może to schrzaniłem? Muszę jeszcze raz sprawdzić.
  • Mm. Wiem, że ' można używać wszystkich rejestrów jako wskaźników w trybie 32-bitowym, więc może ' t być REX. Właściwie wydaje się, że w trybie 32-bitowym wystarczy bajt modr / m, aby użyć pojedynczego rejestru jako adresu, w tym przypadku nie jest potrzebny SIB (z wyjątkiem ESP). wiki.osdev.org/…
  • @ilkkachu Jup, ale ' ponownie, aby użyć rejestru jako podstawy z innym jako indeks, potrzebny jest SIB. Sprawdzę to dwukrotnie i popraw odpowiedź. ok?

Odpowiedź

BX to najstarszy rejestr indeksowania. Zwykle dostęp do elementu w strukturze byłby uzyskiwany przez [BX + constant]; stąd jego nazwa (lub prawdopodobnie nazwa pochodzi od [BX + SI]; tylko BX lub BP można używać po lewej stronie, a tylko SI i DI po prawej stronie).

Nie mogłem znaleźć nic szczególnego na temat ebx / rbx poza tym, że jest to najniższy rejestr nieobrobiony żadną instrukcją (mul / div / shl / shr), więc jest to dobre miejsce na umieszczenie wskaźnik.

Z drugiej strony, [esp + offset] jest dłuższą instrukcją niż [ebp + offset], więc eliminacja wskaźnika ramki nie zawsze generuje krótszy kod.

Komentarze

  • Czy na pewno 32-bitowe kody operacyjne są krótsze? W trybie 16-bitowym istnieją jawne kodowania dla kombinacji BX / BP, SI / DI i 8 lub 16-bitowego przemieszczenia, a inne warianty nie są kodowane; w trybie 32-bitowym używane jest ogólne kodowanie rejestrów (EAX / ECX / EDX / EBX / ESP / EBP / ESI / EDI), z wyjątkiem tego, że 100b (zwykle ESP) jest używane do oznaczenia bajtu SIB, a 101b (zwykle EBP ) bez przesunięcia jest używany do oznaczenia przesunięcia 32-bitowego.MOV EAX, [EBX+9] zajmuje 3 bajty, podobnie jak MOV EAX, [ECX+9]; z dodatkowym rejestrem potrzebujesz 4 bajtów.
  • @StephenKitt: Jestem poprawiony. Jedynym, który jest faktycznie dłuższy, jest [esp + x]

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *