A BX az alapcím-nyilvántartás, és ha igen, miért?

Sok bejegyzést láttam a BX-en. Úgy gondolom, hogy ma “általános célú regisztráció”. Zavarban vagyok, hogy miért hívják az emberek az alapcím-nyilvántartásnak?

  • Miért hívják történelmileg az alapcím-nyilvántartásra.
  • Van-e ezek közül még ma is releváns ?
  • Van olyan megállapodás, amely fenntartja az alapcímzéshez való használatát?

Láthatja itt hívják .

Megjegyzések

  • Ha belegondolunk, ez nem ‘ nem pontosan egy RC kérdés, mivel nem ‘ nem céloz semmit a régi számítógépről – főleg nem azért, mert ma relevanciát kér. Ez a kérdés jobban megfelelne az SE főoldalán – és egy gyors keresés azt mutatja, hogy ott nagyon sokat kértek variációkról.
  • Szerintem itt kulcsfontosságú, hogy az x86-os regiszterek csak ” többé-kevésbé általános célú “, bármelyiket használhatja az alapműveleteknél, de vannak / voltak olyan helyzetek, amikor korlátozták, hogy mely regisztrációkat használhatja se.
  • Egy másik kulcsfontosságú tény, hogy a történelmi használat és a mai használat összehasonlítása félrevezető, amikor az x86-ot illeti (itt feltételezem, hogy az „Általános célú nyilvántartással” kapcsolatos megjegyzés valóban az EBX / RBX-re utal. mint BX). A jelenlegi x86 visszafelé kompatibilis a 8086-tal, de a mai x86-os összeállítási nyelvű programozás nagyon-nagyon különbözik a 8086-os programozáshoz (vagy akár a 386-os programozáshoz); így a BX használata nem feltétlenül mond sokat az EBX / RBX használatáról.

Válasz

A BX mindig is az általános regiszterek egyike volt, és mindig is alapregiszternek hívták (lásd például The 8086 Primer , 19. oldal). Ez az alapregiszter, mert különböző alapú címzési módokban használható: egy cím BX-ben történő tárolása, egy eltolás SI vagy DI-ben (a forrás- és a cél-index regiszterek) lehetővé teszi a memória elérését BX + SI vagy BX címen. + DI ( ugyanott , 31. oldal), vagy BX + SI + azonnali , vagy akár a BX + azonnali . A XLAT alapjaként is szolgál.

A BP hasonló, és támogatja az összes fenti címzési módot. A BX és a BP közötti különbség az, hogy a BX alapértelmezés szerint az adatszegmenst (DS), míg a BP a veremszegmenst (SS). (A BX-nek és a BP-nek is megvannak a maga sajátos utasításai – eg XLAT a BX-t, ENTER és LEAVE használja a BP-t.)

Ezek a címzési módok még mindig léteznek, ezért használatuk továbbra is releváns, de indexelt és közvetett címzés bármely általános, mutató- vagy indexregiszterrel elérhető, 32 bites x86-tal kezdődően . Míg a BX és a BP „különleges” a 16 bites x86-on, annyiban, hogy csak azok a regiszterek, amelyekkel közvetett vagy indexelt címzés lehetséges, ez a 32 vagy 64 bites x86 esetében már nem így van, így az EBX, EBP, RBX , és az RBP nem egészen olyan különleges. (A BP, az EBP és az RBP még mindig némileg különleges, mivel 16 és 32 bites módban az SS-t választják alapregiszterként, és eltolás nélkül nem használhatók mutatókként, ie van a (z) MOV AX, [BP] és a MOV AX, [BP+0] opcode nincs használva.)

Nincs olyan konvenció, amiről tudom a BX használatának kifejezetten fenntartása az alapcímzéshez; ha alapcímzéshez kell használni, akkor megfelelően beállítja és használja. Ha a használatban lévő hívó egyezmény előírja, hogy a BX megmaradjon, akkor győződjön meg róla, hogy ezt figyelembe veszi (hívóként vagy hívottként, az egyezménytől és az írott kódtól függően).

Megjegyzések

  • +2 az XLAT / ENTER / LEAVE hozzáadásához.

Válasz

(Ez kiegészül Stephen Kitts válaszával)

Miért hívják történelmileg az alapcímregiszternek.

Nos, ez nem “t”. Ha mindez akkor “Base Index” (vagy jobb Index Base) lenne, mivel az eredeti 16 bites címzéssel volt az egyetlen regiszter, amely hozzáadható “Base” néven az összes indexelt címzésnél. Indexelve: SI vagy DI. (* 1)

Ez a címzés szimmetrikus volt, az BP mint alapmutató. Az alapgondolat az volt, hogy egy tömbre BX-lel lehet mutatni, és a SI vagy a DI segítségével további beszélgetés nélkül – vagy a BP-n keresztül lehet megadni verem (* 2)

Amellett, hogy az eredeti általános célú két bájtos regiszterek egyike.

Van ebből valami még ma is releváns?

Nem igazán. Legalábbis 32/64 bites módban.A REX címzés lehetővé teszi bármely “klasszikus” regiszter használatát (index) alapként 32 bites módban – kivéve a BP / SP (* 3). 64 bites módban a 16 regiszterből 12 ugyanúgy használható (Not BP / SP / R12 / R13 (* 4)).

Miután ezt elmondta, jön a „Hosszú” mód 16 bites védett módú kódszegmensekkel . Itt a klasszikus (16 bites) kódolást használják a 32/64 bites regisztermérettel együtt. A BX megőrzi kódolási előnyét, mivel a SIB nincs szükség. Hogy mennyire releváns ez a meglehetősen elfelejtett mód, az megvitatásra vár.

Van olyan megállapodás, amely fenntartja a használatát az alapcímzéshez?

Nem igazán. Szükség szerint használja. Végül is ez a közgyűlés – nincs olyan egyezmény, amelyet nem akarsz :))

Az egyetlen kérdés, amelyet szem előtt kell tartani, ha megőrzi a hívója számára (hacsak nem kifejezetten nem történt meg)

Itt láthatja, hogy így hívják.

Err … lehetővé teszi mondjuk nem téved, de azt javaslom, hogy keressen egy részletesebb leírást az x86 (Check Wiki (books) vagy OSDEV-Wiki ) megismeréséhez. Vagy ha a klasszikus (16 bites) x86 programozásra vonatkozik, akkor csak egy könyvet kell elolvasnia: Steve Morse “ 8086 Primer . A 32/64-es bit egyébként különbözik, és ezeket a klasszikus feltételezések nélkül kell megtanulni, hogy valóban hasznosak legyenek a speciális esetek hátizsákja helyett a speciális eseteknél.


* 1 – Ha emlékeztetőt szeretne rendelni a 4 alapvető két bájtos regiszter neve, ez lehet

  • AX = A ccumulator . A rithmetic (vagy A mindig a legrövidebb kódolás)
  • BX = B ase. Az adatok (struktúrák) mutatójaként használják
  • CX = C ounter. Használt shift / rotate, string ops és ciklusokban.
  • DX = D ata. Aritmetikában és I / O-ban használják.

* 2 – Ezután ismét “normál” programozás esetén BP tartja a verem keretet, Tehát egy index itt mindig index a keretbe, hacsak a BP-t ideiglenesen nem helyezik át.

* 3 – SP a kódolás.

* 4 – SP / R12 ismét a következővel: SIB kódolás.

Megjegyzések

  • REX addressing allows [using any register in 32-bit mode] – komolyan gondoltad SIB itt?
  • @ilkkachu Nop. Legalábbis nem, amennyire emlékszem. A REX lehetővé teszi az r / m mód használatát az összes regiszterrel. SIB csak SP és R12 esetén szükséges. És persze, ha méretezést akarsz használni … vagy ezt elcsesztem? Újra ellenőriznem kell.
  • Mm. Tudom, hogy ‘ lehetséges az összes regiszter mutatóként történő használata 32 bites módban, így ‘ nem lehet REX. Valójában úgy tűnik, hogy 32 bites módban csak a modr / m bájt elegendő egyetlen regiszter címként való használatához, az esethez nincs szükség SIB-re (az ESP kivételével). wiki.osdev.org/…
  • @ilkkachu Jup, de te ‘ igaza van annak is, hogy egy regisztert bázisként használjon és egy t indexként, SIB-re van szükség. Hadd ellenőrizzem ezt még egyszer, és helyesbítsem a válaszomat. rendben?

Válasz

A BX a legrégebbi indexelő regiszter. A struktúra egyik eleméhez általában a következőt kell elérni: [BX + constant]; innen származik a neve (vagy esetleg a név az [BX + SI] szóból származik; a bal oldalon csak a BX vagy a BP használható, a jobb oldalon pedig csak az SI és a DI).

Nem találtam egy bizonyos dolgot az ebx / rbx-ről, kivéve azt, hogy ez a legalacsonyabb regiszter, amelyet egy konkrét utasítás nem hamisít meg (mul / div / shl / shr), így jó hely a mutató.

Másrészt az [esp + offset] hosszabb utasítás, mint az [ebp + offset], így a keretmutató megszüntetése nem mindig generál rövidebb kódot.

Megjegyzések

  • Biztos benne, hogy a 32 bites opkódok rövidebbek? 16 bites módban kifejezett kódolások vannak a BX / BP, SI / DI és egy 8 vagy 16 bites elmozdítás kombinációihoz, és más változatok nem kódolhatók; 32 bites módban az általános regiszterkódolást használják (EAX / ECX / EDX / EBX / ESP / EBP / ESI / EDI), azzal a különbséggel, hogy 100b (általában ESP) SIB bájt jelölésére szolgál, és 101b (általában EBP) ) elmozdulás nélküli 32 bites eltolás jelzésére szolgál.MOV EAX, [EBX+9] 3 bájtot vesz igénybe, csakúgy, mint MOV EAX, [ECX+9]; egy további regiszterrel 4 bájtra van szükséged.
  • @StephenKitt: Kijavítva állok. Az egyetlen, ami valójában hosszabb, az [esp + x]

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük