BX é o registro de endereço de base e, se sim, por quê?

Eu vi muitas postagens no BX. Acredito que hoje é um “Registro de uso geral”. Estou confuso sobre por que as pessoas o chamam de Registro de endereço de base,

  • Por que é chamado de registro de endereço de base, historicamente.
  • Alguma dessas ainda é relevante hoje ?
  • Existe uma convenção para reservar seu uso para endereçamento de base?

Você pode ver sendo chamado assim aqui .

Comentários

  • Pensando nisso, não é ‘ é exatamente uma pergunta RC, uma vez que não ‘ tem como alvo nada sobre o computador antigo – especialmente porque pede relevância hoje . Esta pergunta seria mais adequada no site principal do SE – e uma pesquisa rápida mostra que variações foram muito solicitadas lá.
  • Acho que a chave aqui é que os registros em x86 são apenas ” de propósito mais ou menos geral “, você pode usar qualquer um deles nas operações básicas, mas há / houve situações em que você estava restrito a quais registros poderia usar se.
  • Outro ponto importante é que comparar o uso histórico e o uso moderno é enganoso quando se trata de x86 (estou assumindo aqui que o comentário sobre “Registro de uso geral” realmente se refere a EBX / RBX, em vez de do que BX). O x86 atual é compatível com as versões anteriores do 8086, mas a programação em linguagem assembly do x86 moderna é muito, muito diferente em comparação com a programação do 8086 (ou mesmo da programação 386); portanto, o uso de BX não diz necessariamente muito sobre o uso de EBX / RBX.

Resposta

BX sempre foi um dos registradores gerais e sempre foi chamado de registrador de base (ver por exemplo The 8086 Primer , página 19). É o registrador base porque pode ser usado em vários modos de endereçamento baseados: armazenar um endereço em BX e um deslocamento em SI ou DI (os registradores de índice de origem e destino, respectivamente), permite que a memória seja acessada em BX + SI ou BX + DI ( ibid , página 31), ou BX + SI + imediato , ou mesmo BX + imediato . Ele também serve como base para XLAT.

O BP é semelhante e suporta todos os modos de endereçamento acima. A diferença entre BX e BP é que o padrão BX é o segmento de dados (DS), enquanto o padrão BP é o segmento de pilha (SS). (BX e BP também têm suas próprias instruções específicas – por exemplo, XLAT usa BX, ENTER e LEAVE use BP.)

Esses modos de endereçamento ainda existem hoje, então seu uso ainda é relevante, mas endereçamento indexado e indireto estão disponíveis com qualquer registro geral, ponteiro ou índice começando com x86 de 32 bits . Embora BX e BP sejam “especiais” em x86 de 16 bits, por serem os únicos registros com os quais o endereçamento indireto ou indexado é possível, esse não é mais o caso em x86 de 32 ou 64 bits, portanto EBX, EBP, RBX e RBP não são tão especiais. (BP, EBP e RBP ainda são um pouco especiais, uma vez que selecionam SS como o registro de base no modo de 16 e 32 bits, e não podem ser usados como ponteiros sem um deslocamento, ie há nenhum opcode para MOV AX, [BP] e MOV AX, [BP+0] acaba sendo usado em seu lugar.)

Não há convenção, estou ciente de reservar especificamente o uso de BX para endereçamento de base; se precisar usá-lo para endereçamento de base, configure-o apropriadamente e use-o. Se a convenção de chamada em uso exige que BX seja preservado, você precisa garantir que leva isso em conta (como chamador ou receptor, dependendo da convenção e do código que você está escrevendo).

Comentários

  • +2 para adição de XLAT / ENTER / LEAVE.

Resposta

(Isso em adição à resposta de Stephen Kitts)

Por que ele “é chamado de registro de endereço de base, historicamente.

Bem, não é. Se fosse tudo, então seria “Índice Base” (ou melhor, Índice Base), já que estava no original de 16 bits endereçando o único registro que poderia ser adicionado como “Base” em todos os endereçamentos indexados. Indexado com SI ou DI que é. (* 1)

Este endereçamento era simétrico com BP como Ponteiro de Base. A ideia básica era que uma matriz pode ser apontada com BX e endereçada via SI ou DI sem mais delongas – ou BP quando dentro do stack (* 2)

Ao lado de que é um dos registradores originais de dois bytes de uso geral.

É algum desses ainda é relevante hoje?

Na verdade, não. Pelo menos não no modo de 32/64 bits.O endereçamento REX permite o uso de qualquer registro “clássico” como base (índice) no modo de 32 bits – exceto BP / SP (* 3). No modo de 64 bits, 12 dos 16 registros podem ser usados da mesma maneira (Não BP / SP / R12 / R13 (* 4)).

Agora, dito isso, vem o modo “Longo” com segmentos de código de modo protegido de 16 bits . Aqui, a codificação clássica (16 bits) é usada junto com o tamanho do registro de 32/64 bits. BX mantém sua vantagem de codificação, pois SIB não é necessário. Até que ponto este modo um tanto esquecido é relevante está em discussão.

Existe uma convenção para reservar seu uso para endereçamento de base?

Na verdade, não. Use conforme necessário. Afinal, isso é Assembly – não há convenção que você não queira :))

O único problema a se manter em mente é preservá-lo para o seu chamador (a menos que não seja explicitamente feito)

Você pode vê-lo sendo chamado assim aqui.

Err … vamos diga que ele não está errado, mas eu recomendaria procurar uma descrição mais detalhada para aprender sobre x86 (verifique o Wiki (livros) ou OSDEV-Wiki ). Ou se for específico sobre a programação x86 clássica (16 bits), então há apenas um livro para você ler: Steve Morse “ 8086 Primer . 32/64 Bit é diferente de qualquer maneira e precisa ser aprendido sem essas suposições clássicas para ser realmente útil em vez de uma mochila de casos especiais em casos especiais.


* 1 – Se você quiser atribuir mnemônico nomes para os 4 registros básicos de dois bytes, pode ser

  • AX = Um ccumulador . Usado para A ritmético (ou A sempre a codificação mais curta)
  • BX = B ase. Usado como um ponteiro para dados (estruturas)
  • CX = C onter. Usado em shift / rotate, string ops e loops.
  • DX = D ata. Usado em aritmética e I / O.

* 2 – Então, novamente, no caso de programação “padrão”, BP mantém o frame da pilha, portanto, um índice aqui é sempre um índice nesse quadro, a menos que o BP seja temporariamente movido.

* 3 – SP também pode ser usado com SIB codificação.

* 4 – SP / R12 novamente com SIB codificação.

Comentários

  • REX addressing allows [using any register in 32-bit mode] – você quis dizer SIB aqui?
  • @ilkkachu Nop. Pelo menos não tanto quanto me lembro. REX permite usar o modo r / m com todos os registros. SIB é necessário apenas para SP e R12. E, claro, se você quiser usar o dimensionamento … ou eu estraguei tudo? Tenho que verificar novamente.
  • Hmm. Eu sei que ‘ é possível usar todos os registradores como ponteiros no modo de 32 bits, então não pode ‘ ser REX. Na verdade, parece que no modo de 32 bits, apenas o byte modr / m é suficiente para usar um único registrador como endereço, nenhum SIB necessário para esse caso (exceto para ESP). wiki.osdev.org/…
  • @ilkkachu Jup, mas você ‘ também está certo usar um registro como base com outro como índice, o SIB é necessário. Deixe-me verificar isso novamente e corrigir minha resposta. ok?

Resposta

BX é o registro de indexação mais antigo. Normalmente, um elemento em uma estrutura seria acessado por [BX + constant]; daí seu nome (ou possivelmente o nome vem de [BX + SI]; apenas BX ou BP podem ser usados no lado esquerdo, e apenas SI e DI podem ser usados no lado direito).

Não consegui encontrar algo em particular sobre ebx / rbx, exceto por ser o registro mais baixo não superado por uma instrução específica (mul / div / shl / shr), então é um bom lugar para colocar um ponteiro.

Por outro lado, [esp + deslocamento] é uma instrução mais longa do que [ebp + deslocamento], portanto, a eliminação do ponteiro de quadro nem sempre gera um código mais curto.

Comentários

  • Tem certeza de que os opcodes de 32 bits são mais curtos? No modo de 16 bits, existem codificações explícitas para as combinações de BX / BP, SI / DI e um deslocamento de 8 ou 16 bits, e outras variantes não são codificáveis; no modo de 32 bits, a codificação de registro genérico é usada (EAX / ECX / EDX / EBX / ESP / EBP / ESI / EDI), exceto que 100b (geralmente ESP) é usado para significar um byte SIB e 101b (geralmente EBP ) sem deslocamento é usado para significar um deslocamento de 32 bits.MOV EAX, [EBX+9] ocupa 3 bytes, assim como MOV EAX, [ECX+9]; com um registro adicional você precisa de 4 bytes.
  • @StephenKitt: Estou corrigido. O único que é realmente mais longo é [esp + x]

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *