Jai vu beaucoup de messages sur BX. Je crois quaujourdhui, cest un « registre à usage général ». Je ne sais pas pourquoi les gens lappellent le registre des adresses de base,
- Pourquoi on lappelle le registre des adresses de base, historiquement.
- Est-ce que tout cela est encore pertinent aujourdhui ?
- Y a-t-il une convention pour réserver son utilisation pour ladressage de base?
Vous pouvez le voir étant appelé comme ça ici .
Commentaires
- En y pensant, ce nest pas ‘ t exactement une question RC, car elle ne ‘ t cible rien sur un vieil ordinateur – surtout pas car elle demande de la pertinence aujourdhui . Cette question serait mieux adaptée sur le site principal de SE – et une recherche rapide montre que des variations y ont été souvent demandées.
- Je pense quune clé ici est que les registres sur x86 ne sont que » à usage plus ou moins général « , vous pouvez utiliser nimporte lequel dentre eux dans les opérations de base mais il y a / était des situations où vous étiez limité quant aux registres que vous pouviez utiliser se.
- Un autre point clé est que comparer lutilisation historique et lutilisation moderne est trompeur en ce qui concerne x86 (je suppose ici que le commentaire sur «General Purpose Register» fait plutôt référence à EBX / RBX que BX). Le x86 actuel est rétrocompatible avec le 8086, mais la programmation en langage assembleur x86 moderne est très, très différente par rapport à la programmation 8086 (ou même la programmation 386); donc lutilisation de BX ne dit pas nécessairement grand-chose sur lutilisation dEBX / RBX.
Réponse
BX a toujours été lun des registres généraux, et il a toujours été appelé le registre de base (voir par exemple Le 8086 Primer , page 19). Cest le registre de base car il peut être utilisé dans différents modes dadressage basés: stocker une adresse dans BX, et un offset dans SI ou DI (respectivement les registres dindex source et de destination), permet daccéder à la mémoire en BX + SI ou BX + DI ( ibid , page 31), ou BX + SI + immédiat , voire BX + immédiat . Il sert également de base pour XLAT
.
BP est similaire et prend en charge tous les modes dadressage ci-dessus. La différence entre BX et BP est que BX utilise par défaut le segment de données (DS), tandis que BP utilise par défaut le segment de pile (SS). (BX et BP ont chacun leurs propres instructions spécifiques – par exemple XLAT
utilise BX, ENTER
et LEAVE
utilise BP.)
Ces modes dadressage existent encore aujourdhui, donc leur utilisation est toujours dactualité, mais adressage indexé et indirect sont disponibles avec nimporte quel registre général, pointeur ou index commençant par 32 bits x86 . Alors que BX et BP sont «spéciaux» sur les x86 16 bits, en ce quils sont les seuls registres avec lesquels un adressage indirect ou indexé est possible, ce nest plus le cas sur les x86 32 ou 64 bits donc EBX, EBP, RBX et RBP ne sont pas si spéciaux. (BP, EBP et RBP sont encore quelque peu spéciaux car ils sélectionnent SS comme registre de base en mode 16 et 32 bits, et ne peuvent pas être utilisés comme pointeurs sans décalage, cest-à-dire il y a aucun opcode pour MOV AX, [BP]
et MOV AX, [BP+0]
ne finit par être utilisé à la place.)
Il ny a pas de convention à ma connaissance de réserver spécifiquement lutilisation de BX pour ladressage de base; si vous devez lutiliser pour ladressage de base, vous le configurez de manière appropriée et vous lutilisez. Si la convention dappel en cours dutilisation exige que BX soit préservé, vous devez vous assurer de prendre cela en compte (en tant quappelant ou appelé selon la convention et le code que vous écrivez).
Commentaires
- +2 pour lajout de XLAT / ENTER / LEAVE.
Réponse
(Ceci sajoute à la réponse de Stephen Kitts)
Pourquoi cela sappelle le registre dadresse de base, historiquement.
Eh bien, ce nest pas « t. Si tout cela, alors ce serait « Base Index » (ou mieux Index Base), car il était dans ladressage 16 bits dorigine le seul registre qui pouvait être ajouté comme « Base » dans tout adressage indexé. Indexé avec SI
ou DI
cest-à-dire. (* 1)
Cet adressage était symétrique avec BP
comme pointeur de base. Lidée de base était quun tableau peut être pointé vers avec BX et adressé via SI
ou DI
sans plus tarder – ou BP lorsque stack (* 2)
En plus de cela, cest lun des registres originaux à deux octets à usage général.
Est-ce que toujours dactualité?
Pas vraiment. Du moins pas en mode 32/64 bits.Ladressage REX
permet dutiliser nimporte quel registre « classique » comme base (dindex) en mode 32 bits – sauf BP
/ SP
(* 3). En mode 64 bits, 12 des 16 registres peuvent être utilisés de la même manière (pas BP
/ SP
/ R12
/ R13
(* 4)).
Cela dit, le mode « Long » avec des segments de code en mode protégé 16 bits arrive . Ici, le codage classique (16 bits) est utilisé avec une taille de registre de 32/64 bits. BX
conserve son avantage dencodage, car SIB
nest pas nécessaire. Dans quelle mesure ce mode plutôt oublié est-il pertinent?
Y a-t-il une convention pour réserver son utilisation pour ladressage de base?
Pas vraiment. Utilisez au besoin. Après tout, cest Assembly – il ny a pas de convention que vous ne voulez pas :))
Le seul problème à garder à lesprit est de le préserver pour votre appelant (à moins que ce ne soit explicitement pas fait)
Vous pouvez le voir sappeler ainsi ici.
Err … dis quil « na pas tort, mais je recommanderais de chercher une meilleure description détaillée pour en savoir plus sur x86 (Vérifiez Wiki (livres) ou OSDEV-Wiki ). Ou sil sagit de programmation x86 classique (16 bits), il ny a quun seul livre à lire: Steve Morse « 8086 Primer . 32/64 Bit est différent de toute façon et doit être appris sans ces hypothèses classiques pour être vraiment utile au lieu dun sac à dos de cas spéciaux sur des cas particuliers.
* 1 – Si vous souhaitez attribuer des mnémoniques noms aux 4 registres de base à deux octets, cela pourrait être
- AX = Un ccumulateur . Utilisé pour A rithmétique (ou A est toujours le codage le plus court)
- BX = B ase. Utilisé comme pointeur vers des données (structures)
- CX = C ounter. Utilisé dans les opérations de décalage / rotation, les opérations de chaîne et les boucles.
- DX = D ata. Utilisé en arithmétique et E / S.
* 2 – Là encore, en cas de programmation « standard » BP
tient le cadre de la pile, donc un index ici est toujours un index dans cette image, à moins que BP ne soit temporairement déplacé.
* 3 – SP
peut également être utilisé avec SIB
encodage.
* 4 – SP
/ R12
à nouveau avec SIB
encodage.
Commentaires
-
REX addressing allows [using any register in 32-bit mode]
– vouliez-vous dire SIB ici? - @ilkkachu Nop. Du moins pas aussi loin que je me souvienne. REX permet dutiliser le mode r / m avec tous les registres. SIB nest nécessaire que pour SP et R12. Et bien sûr, si vous voulez utiliser la mise à léchelle … ou ai-je foiré ça? Je dois vérifier à nouveau.
- Mm. Je sais quil est ‘ possible dutiliser tous les registres comme pointeurs en mode 32 bits, donc il peut ‘ être REX. En fait, il semble quen mode 32 bits, seul loctet modr / m suffit pour utiliser un seul registre comme adresse, pas de SIB nécessaire dans ce cas (sauf pour ESP). wiki.osdev.org/…
- @ilkkachu Jup, mais vous ‘ aussi bien, pour utiliser un registre comme base avec un autre comme index, SIB est nécessaire. Permettez-moi de vérifier cela et de corriger ma réponse. ok?
Réponse
BX est le plus ancien registre dindexation. En règle générale, un élément dans une structure serait accessible par [BX + constant]
; doù son nom (ou peut-être le nom vient de [BX + SI]
; seuls BX ou BP peuvent être utilisés sur le côté gauche, et seuls SI et DI peuvent être utilisés sur le côté droit).
Je nai pas pu trouver quelque chose de particulier à propos debx / rbx, sauf que cest le registre le plus bas non écrasé par une instruction spécifique (mul / div / shl / shr) donc cest un bon endroit pour mettre un pointeur.
Dun autre côté, [esp + offset] est une instruction plus longue que [ebp + offset] donc lélimination du pointeur de cadre ne génère pas toujours un code plus court.
Commentaires
- Etes-vous sûr que les opcodes 32 bits sont plus courts? En mode 16 bits, il existe des codages explicites pour les combinaisons de BX / BP, SI / DI et un déplacement de 8 ou 16 bits, et d’autres variantes ne sont pas codables; en mode 32 bits, le codage de registre générique est utilisé (EAX / ECX / EDX / EBX / ESP / EBP / ESI / EDI), sauf que 100b (généralement ESP) est utilisé pour signifier un octet SIB, et 101b (généralement EBP ) sans déplacement est utilisé pour signifier un décalage de 32 bits.
MOV EAX, [EBX+9]
prend 3 octets, tout commeMOV EAX, [ECX+9]
; avec un registre supplémentaire, vous avez besoin de 4 octets. - @StephenKitt: Je suis corrigé. Le seul qui est en fait plus long est [esp + x]