Olen nähnyt paljon viestejä BX: ssä. Uskon tänään, että se on ”yleiskäyttöinen rekisteri”. Olen hämmentynyt siitä, miksi ihmiset kutsuvat sitä perusosastorekisteriksi.
- Miksi sitä kutsutaan perusosoiterekisteriksi, historiallisesti.
- Onko jokin niistä edelleen ajankohtainen tänään ?
- Onko olemassa yleissopimus, jolla varataan sen käyttö pohjaosoitteisiin?
Näet sen Sitä kutsutaan täältä .
Kommentit
- Kun ajattelen sitä, tämä ei ole ’ ei tarkalleen RC-kysymys, koska se ei ’ kohdistu mihinkään vanhasta tietokoneesta – varsinkaan koska se kysyy osuvuutta tänään . Tämä kysymys sopisi paremmin SE: n pääsivustolla – ja nopea haku osoittaa, että muunnelmia on kysytty paljon.
- Mielestäni avain tässä on, että x86: n rekisterit ovat vain ” enemmän tai vähemmän yleiskäyttöinen ”, voit käyttää mitä tahansa niistä perustoiminnoissa, mutta on / oli tilanteita, joissa sinua rajoitettiin rekisterien suhteen se.
- Toinen keskeinen seikka on, että historiallisen käytön ja nykyajan käytön vertaaminen on harhaanjohtavaa x86: n osalta (oletan tässä, että kommentti Yleiskäyttöön tarkoitetusta rekisteristä viittaa todella EBX / RBX: ään. kuin BX). Nykyinen x86 on taaksepäin yhteensopiva 8086: n kanssa, mutta nykypäivän x86-kokoonpanokieliohjelmointi on hyvin, hyvin erilainen kuin 8086-ohjelmointi (tai jopa 386-ohjelmointi); joten BX: n käyttö ei välttämättä sano paljoakaan EBX / RBX: n käytöstä.
Vastaa
BX on aina ollut yksi yleisistä rekistereistä, ja sitä on aina kutsuttu perusrekisteriksi (katso esimerkiksi 8086 Primer , sivu 19). Se on perusrekisteri, koska sitä voidaan käyttää useissa perustuvissa osoitetiloissa: osoitteen tallentaminen BX: ään ja siirtymä SI: ssä tai DI: ssä (lähde- ja kohde-indeksirekisterit vastaavasti), mahdollistaa muistin käytön BX + SI: llä tai BX: llä + DI ( ibid , sivu 31) tai BX + SI + välitön tai jopa BX + välitön . Se toimii myös perustana XLAT
.
BP on samanlainen ja tukee kaikkia yllä olevia osoitetiloja. Ero BX: n ja BP: n välillä on se, että BX oletusasetuksena on datasegmentti (DS), kun taas BP: n oletusarvo on pinosegmentti (SS). (BX: llä ja BP: llä on myös omat erityisohjeet – esim XLAT
käyttää BX: tä, ENTER
ja LEAVE
käytä BP: tä.)
Kyseisiä osoitetiloja on edelleen olemassa, joten niiden käyttö on edelleen merkityksellistä, mutta indeksoitu ja epäsuora osoitteistus div> ovat käytettävissä kaikilla yleisillä, osoitin- tai hakemistorekistereillä, jotka alkavat 32-bittisellä x86: lla . Vaikka BX ja BP ovat ”erikoisia” 16-bittisessä x86: ssa, koska ne ovat ainoat rekisterit, joissa epäsuora tai indeksoitu osoite on mahdollista, niin ei enää ole 32- tai 64-bittisessä x86: ssa, joten EBX, EBP, RBX , ja RBP eivät ole aivan niin erikoisia. (BP, EBP ja RBP ovat edelleen jonkin verran erityisiä, koska ne valitsevat SS: n perusrekisteriksi 16- ja 32-bittisessä tilassa, eikä niitä voida käyttää osoittimina ilman siirtymää, ie on MOV AX, [BP]
: n ja MOV AX, [BP+0]
: n opkoodia ei käytetä sen sijaan.)
Tiedossa ei ole yleissopimusta varata nimenomaan BX: n käyttö perusosoitteisiin; jos sinun on käytettävä sitä perusosoitteisiin, määrität sen oikein ja käytät sitä. Jos käytössä oleva soittokokous edellyttää, että BX säilytetään, sinun on varmistettava, että otat sen huomioon (soittajana tai soittajana käytännön ja kirjoitettavan koodin mukaan).
Kommentit
- +2, kun lisätään XLAT / ENTER / LEAVE.
Vastaa
(Tämä on Stephen Kittsin vastauksen lisäksi)
Miksi sitä kutsutaan Base Address -rekisteriksi, historiallisesti.
No, se ei ole ”t”. Jos kaikki, niin se olisi ”Base Index” (tai parempi Index Base), koska se oli alkuperäisessä 16-bittisessä osoitteessa ainoa rekisteri, joka voidaan lisätä ”Base” -asetuksena kaikkeen indeksoituun osoitteistukseen. Indeksoitu SI
tai DI
. (* 1)
Tämä osoite oli symmetrinen, kun BP
oli perusosoitin. Perusajatuksena oli, että matriisiin voidaan osoittaa BX: llä ja osoite osoitteeseen SI
tai DI
ilman erillisiä tietoja – tai BP, pino (* 2)
Sen lisäksi, että se on yksi alkuperäisistä yleiskäyttöisistä tavuista rekistereistä.
Onko jokin siitä edelleen merkityksellinen tänään?
Ei oikeastaan. Ainakin ei 32/64-bittisessä tilassa.REX
-osoitteen avulla minkä tahansa ”klassisen” rekisterin käyttö (hakemisto) perustana 32-bittisessä tilassa – paitsi BP
/ SP
(* 3). 64-bittisessä tilassa 12 rekisteriä 16 rekisteristä voidaan käyttää samalla tavalla (Not BP
/ SP
/ R12
/ R13
(* 4)).
Tämän sanottuaan tulee ”Pitkä” -tila, jossa on 16-bittiset suojatun tilan koodisegmentit . Tässä käytetään klassista (16-bittistä) koodausta yhdessä 32/64-bittisen rekisterikoon kanssa. BX
säilyttää koodauksen edut, koska SIB
ei tarvita. Kuinka paljon tämä melko unohdettu tila on merkityksellinen, on keskusteltavissa.
Onko olemassa sopimusta varata sen käyttö perusosoitteisiin?
Ei oikeastaan. Käytä tarvittaessa. Loppujen lopuksi tämä on Assembly – ei ole sopimusta, jota et halua :))
Ainoa asia, joka on pidettävä mielessä, on säilyttää se soittajalle (ellei sitä nimenomaisesti ole tehty)
Näet sen kutsuvan täältä.
Virhe … antaa sano, että hän ei ole väärässä, mutta suosittelen etsimään parempaa yksityiskohtaista kuvausta oppiaksesi x86: sta (Check Wiki (kirjat) tai OSDEV-Wiki ). Tai jos se koskee erityisesti klassista (16-bittistä) x86-ohjelmointia, sinun on luettava vain yksi kirja: Steve Morse ” 8086 Primer . 32/64 bittinen on joka tapauksessa erilainen, ja se on opittava ilman näitä klassisia oletuksia, jotta ne olisivat todella hyödyllisiä erikoistapausten repun sijaan erikoistapauksissa.
* 1 – Jos haluat määrittää muistin 4 tavun perusrekisteriin, se voi olla
- AX = A ccumulator . Käytetään A -ritmetiikkaan (tai A aina lyhin koodaus)
- BX = B ase. Käytetään tietojen (rakenteiden) osoittimena
- CX = C ounter. Käytetään shift / rotate, string ops ja loops.
- DX = D ata. Käytetään laskutoimituksessa ja I / O: ssa.
* 2 – Jälleen kerran, jos ”tavallinen” ohjelmointi BP
pitää pinokehystä, joten hakemisto tässä on aina hakemisto kyseiseen kehykseen, ellei BP: tä siirretä väliaikaisesti.
* 3 – SP
voidaan käyttää myös SIB
-koodaus.
* 4 – SP
/ R12
uudelleen SIB
-koodaus.
Kommentit
-
REX addressing allows [using any register in 32-bit mode]
– tarkoititko SIB täällä? - @ilkkachu Nop. Ainakin ei niin pitkälle kuin muistan. REX sallii r / m-tilan käytön kaikissa rekistereissä. SIB tarvitaan vain SP: lle ja R12: lle. Ja tietysti, jos haluat käyttää skaalausta … vai minä ruuvasin sen? Minun on tarkistettava uudelleen.
- Mm. Tiedän, että ’ on mahdollista käyttää kaikkia rekistereitä osoittimina 32-bittisessä tilassa, joten se ei voi olla ’ REX. Itse asiassa näyttää siltä, että 32-bittisessä tilassa vain modr / m tavu riittää käyttämään yhtä rekisteriä osoitteena, eikä SIB tarvita kyseiseen tapaukseen (lukuun ottamatta ESP: tä). wiki.osdev.org/…
- @ilkkachu Jup, mutta sinä ’ on myös oikeassa, jos haluat käyttää rekisteriä perustana ja toisena indeksinä, tarvitaan SIB. Anna minun tarkistaa tämä uudelleen ja korjata vastaukseni. ok?
Vastaa
BX on vanhin indeksointirekisteri. Tyypillisesti rakenteen elementtiin pääsee [BX + constant]
; tästä syystä sen nimi (tai mahdollisesti nimi tulee [BX + SI]
; vain BX: tä tai BP: tä voitiin käyttää vasemmalla puolella ja vain SI: tä ja DI: tä oikealla puolella).
En löytänyt tiettyä asiaa ebx: stä / rbx: stä lukuun ottamatta sitä, että se on pienin rekisteri, jota ei ole salattu tietyllä käskyllä (mul / div / shl / shr), joten se on hyvä paikka laittaa osoitin.
Toisaalta [esp + offset] on pidempi käsky kuin [ebp + offset], joten kehysosoittimen eliminointi ei aina tuota lyhyempää koodia.
Kommentit
- Oletko varma, että 32-bittiset opkoodit ovat lyhyempiä? 16-bittisessä tilassa on nimenomaisia koodauksia yhdistelmille BX / BP, SI / DI ja 8- tai 16-bittiselle siirtymälle, eikä muita variantteja voida koodata; 32-bittisessä tilassa käytetään yleistä rekisterikoodausta (EAX / ECX / EDX / EBX / ESP / EBP / ESI / EDI), paitsi että 100b (yleensä ESP) käytetään SIB-tavun merkitsemiseen ja 101b (yleensä EBP) ) ilman siirtymää käytetään merkitsemään 32-bittistä siirtymää.
MOV EAX, [EBX+9]
vie 3 tavua, samoin kuinMOV EAX, [ECX+9]
; lisärekisterin kanssa tarvitset 4 tavua. - @StephenKitt: Seison korjattu. Ainoa, joka todella on pidempi, on [esp + x]