¿Es BX el registro de direcciones base y, de ser así, por qué?

He visto muchas publicaciones en BX. Creo que hoy es un «Registro de propósito general». Estoy confundido sobre por qué la gente lo llama Registro de direcciones base,

  • Por qué se llama Registro de direcciones base, históricamente.
  • ¿Alguno de eso sigue siendo relevante hoy en día? ?
  • ¿Existe una convención para reservar su uso para el direccionamiento base?

Puede verlo siendo llamado así aquí .

Comentarios

  • Pensando en ello, esto no es ‘ Es exactamente una pregunta de RC, ya que no ‘ no se enfoca en nada acerca de la computadora vieja, especialmente porque pide relevancia hoy . Esta pregunta sería más adecuada en el sitio principal de SE, y una búsqueda rápida muestra que se han solicitado muchas variaciones allí.
  • Creo que una clave aquí es que los registros en x86 son solo » más o menos de propósito general «, puede usar cualquiera de ellos en las operaciones básicas, pero hay / hubo situaciones en las que estaba restringido en cuanto a qué registros podía usar se.
  • Otro punto clave es que comparar el uso histórico y el uso moderno es engañoso cuando se trata de x86 (supongo aquí que el comentario sobre «Registro de propósito general» realmente se refiere a EBX / RBX en lugar de que BX). El x86 actual es compatible con el 8086, pero la programación en lenguaje ensamblador x86 de hoy en día es muy, muy diferente en comparación con la programación del 8086 (o incluso la programación 386); por lo que el uso de BX no necesariamente dice mucho sobre el uso de EBX / RBX.

Respuesta

BX siempre ha sido uno de los registros generales y siempre se le ha llamado registro base (consulte, por ejemplo, The 8086 Primer , página 19). Es el registro base porque se puede usar en varios modos de direccionamiento basados: almacenar una dirección en BX y un desplazamiento en SI o DI (los registros de índice de origen y destino respectivamente) permite acceder a la memoria en BX + SI o BX + DI ( ibid , página 31), o BX + SI + inmediato , o incluso BX + inmediato . También sirve como base para XLAT.

BP es similar y admite todos los modos de direccionamiento anteriores. La diferencia entre BX y BP es que BX tiene como valor predeterminado el segmento de datos (DS), mientras que BP tiene como valor predeterminado el segmento de pila (SS). (BX y BP también tienen sus propias instrucciones específicas: p. Ej. XLAT usa BX, ENTER y LEAVE usa BP.)

Esos modos de direccionamiento aún existen hoy, por lo que su uso sigue siendo relevante, pero direccionamiento indexado e indirecto están disponibles con cualquier registro de índice, puntero o general que comience con x86 de 32 bits . Si bien BX y BP son «especiales» en x86 de 16 bits, ya que son los únicos registros con los que es posible el direccionamiento indirecto o indexado, ese ya no es el caso en x86 de 32 o 64 bits, por lo que EBX, EBP, RBX y RBP no son tan especiales. (BP, EBP y RBP siguen siendo algo especiales, ya que seleccionan SS como registro base en el modo de 16 y 32 bits, y no se pueden usar como punteros sin un desplazamiento, es decir hay ningún código de operación para MOV AX, [BP] y MOV AX, [BP+0] termina siendo usado en su lugar.)

No hay ninguna convención que yo sepa de reservar específicamente el uso de BX para direccionamiento de base; si necesita usarlo para el direccionamiento base, configúrelo apropiadamente y utilícelo. Si la convención de llamadas en uso exige que BX se mantenga, debe asegurarse de tener eso en cuenta (como llamador o destinatario de la llamada según la convención y el código que está escribiendo).

Comentarios

  • +2 para agregar XLAT / ENTER / LEAVE.

Responder

(Esto se suma a la respuesta de Stephen Kitts)

Por qué se llama registro de dirección base, históricamente.

Bueno, no lo es. Si es todo, entonces sería «Índice base» (o mejor Índice Base), ya que estaba en el direccionamiento original de 16 bits, el único registro que podría agregarse como «Base» en todo el direccionamiento indexado. Indexado con SI o DI es decir. (* 1)

Este direccionamiento era simétrico con BP como puntero base. La idea básica era que una matriz se puede señalar con BX y direccionar a través de SI o DI sin más preámbulos, o BP cuando se encuentra dentro del stack (* 2)

Además de que es uno de los registros originales de dos bytes de propósito general.

¿Es algo de eso ¿Sigue siendo relevante hoy en día?

En realidad, no. Al menos no en el modo de 32/64 bits.El direccionamiento REX permite el uso de cualquiera de los registros «clásicos» como base (índice) en el modo de 32 bits, excepto BP / SP (* 3). En el modo de 64 bits, 12 de los 16 registros se pueden usar de la misma manera (no BP / SP / R12 / R13 (* 4)).

Ahora, habiendo dicho eso, viene el modo «largo» con segmentos de código de modo protegido de 16 bits . Aquí se utiliza la codificación clásica (16 bits) junto con un tamaño de registro de 32/64 bits. BX conserva su ventaja de codificación, ya que SIB no es necesario. Hasta qué punto este modo olvidado es relevante está en discusión.

¿Existe una convención para reservar su uso para direccionamiento base?

En realidad, no. Úselo según sea necesario. Después de todo, esto es Ensamblaje – no hay una convención que no quieras :))

La única cuestión a tener en cuenta es preservarla para la persona que llama (a menos que no se haga explícitamente)

Puede ver que se llama así aquí.

Err … vamos digo que no se equivoca, pero recomendaría buscar una descripción mejor detallada para aprender sobre x86 (consulte Wiki (libros) o OSDEV-Wiki ). O si es específico sobre la programación x86 clásica (16 bits), entonces solo hay un libro que puede leer: Steve Morse « 8086 Primer . 32/64 Bit es diferente de todos modos y es necesario aprenderlo sin estos supuestos clásicos para que sea realmente útil en lugar de una mochila de casos especiales en casos especiales.


* 1 – Si desea asignar mnemotécnicos nombres a los 4 registros básicos de dos bytes, podría ser

  • AX = A ccumulator . Se utiliza para A ritmética (o A siempre la codificación más corta)
  • BX = B ase. Se utiliza como puntero a datos (estructuras)
  • CX = C ounter. Se usa en shift / rotate, string ops y loops.
  • DX = D ata. Se usa en aritmética y E / S.

* 2 – Por otra parte, en el caso de la programación «estándar», BP contiene el marco de la pila, por lo que un índice aquí es siempre un índice en ese marco, a menos que BP se mueva temporalmente.

* 3 – SP también se puede usar con SIB codificación.

* 4 – SP / R12 de nuevo con SIB codificación.

Comentarios

  • REX addressing allows [using any register in 32-bit mode] – ¿quiso decir ¿SIB aquí?
  • @ilkkachu Nop. Al menos no que yo recuerde. REX permite utilizar el modo r / m con todos los registros. SIB solo es necesario para SP y R12. Y, por supuesto, si quieres usar la escala … ¿o lo arruiné? Tengo que comprobarlo de nuevo.
  • Mm. Sé que ‘ s posible usar todos los registros como punteros en el modo de 32 bits, por lo que no puede ‘ ser REX. En realidad, parece que en el modo de 32 bits, solo el byte modr / m es suficiente para usar un solo registro como dirección, no se necesita SIB para ese caso (excepto para ESP). wiki.osdev.org/…
  • @ilkkachu Jup, pero tú ‘ También es correcto, para usar un registro como base con otro como índice, se necesita SIB. Permítanme verificar esto y corregir mi respuesta. ¿ok?

Respuesta

BX es el registro de indexación más antiguo. Normalmente, [BX + constant] accedería a un elemento de una estructura; de ahí su nombre (o posiblemente el nombre proviene de [BX + SI]; solo BX o BP podrían usarse en el lado izquierdo, y solo SI y DI podrían usarse en el lado derecho).

No pude encontrar nada en particular acerca de ebx / rbx excepto que es el registro más bajo que no ha sido golpeado por una instrucción específica (mul / div / shl / shr) por lo que es un buen lugar para poner un puntero.

Por otro lado, [esp + offset] es una instrucción más larga que [ebp + offset] por lo que la eliminación del puntero de cuadro no siempre genera código más corto.

Comentarios

  • ¿Está seguro de que los códigos de operación de 32 bits son más cortos? En el modo de 16 bits, hay codificaciones explícitas para las combinaciones de BX / BP, SI / DI y un desplazamiento de 8 o 16 bits, y otras variantes no son codificables; en el modo de 32 bits, se usa la codificación de registro genérico (EAX / ECX / EDX / EBX / ESP / EBP / ESI / EDI), excepto que 100b (generalmente ESP) se usa para significar un byte SIB, y 101b (generalmente EBP ) sin desplazamiento se utiliza para indicar un desplazamiento de 32 bits.MOV EAX, [EBX+9] ocupa 3 bytes, al igual que MOV EAX, [ECX+9]; con un registro adicional, necesita 4 bytes.
  • @StephenKitt: Estoy corregido. El único que es más largo es [esp + x]

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *