O que significa o 'R' nos nomes de registro x64?

27

Eu sei que os registradores de 32 bits foram nomeados como os registradores de 16 bits com um prefixo 'E' para significar estendido. Eu sempre assumi que isso significava estendido de 16 para 32 bits, embora nunca tenha visto isso explicitamente.

Eu estava tentando descobrir o que o 'R' significa, mas minhas habilidades no google falharam comigo. Ninguem sabe?

Matt
fonte

Respostas:

32

Significa registrar , e não é tudo por razões históricas.

A parte histórica é que a Intel adquiriu o hábito de enumerar registros com letras com o 8008 (A a E mais H e L). Esse esquema era mais do que adequado na época, porque os microprocessadores tinham muito poucos registros e não eram propensos a obter mais, e a maioria dos projetos o fazia. O sentimento predominante na época era que o software seria reescrito para novas CPUs à medida que apareciam, portanto, alterar o esquema de nomeação de registros entre os modelos não seria um grande problema. Ninguém previu que o 8088 evoluiu para uma "família" após ser incorporado ao IBM PC, e o jugo de compatibilidade com versões anteriores obrigou a Intel a adotar esquemas como o "E" nos registros de 32 bits para mantê-lo.

A parte não histórica é toda prática. O uso de letras para registros de uso geral o limita a 26, menos se você eliminar aqueles que possam causar confusão com os nomes de registros de fins especiais, como o contador do programa, sinalizadores ou o ponteiro da pilha.

Não tenho uma fonte para confirmá-lo, mas suspeito que a escolha Rcomo prefixo e a introdução de R8 a R15 em CPUs de 64 bits sinalizam uma transição para registros numerados, que têm sido a norma entre 32 bits e arquiteturas maiores não derivadas do 8008 por quase meio século. A IBM fez isso na década de 1960 com o 360 e foi seguida pelo PowerPC, DEC Alpha, MIPS, SPARC, ARM, i860 e i960 da Intel e muitos outros que há muito estão esquecidos.

Você notará que os registros existentes se encaixariam perfeitamente entre R0 e R7 se eles existissem, e não me surpreenderia um pouco se eles fossem tratados dessa maneira internamente. Os registros longos existentes (RAX / EAX / AX / AL, RBX / EBX / BX / BL, etc.) provavelmente permanecerão por perto até o sol queimar.

Blrfl
fonte
1
Um pouco anticlimático, mas acho que não deveria me surpreender. Obrigado.
Matt
3
Esse foi todo o drama que pude reunir. :-)
Blrfl 01/01
+1 para a leitura muito interessante. Mas se fosse para ser resumido em apenas uma linha, teria sido a resposta que eu dei. Toda essa informação rica e interessante é reduzida a "razões históricas" se resumida.
Mike Nakis
6
AMD se considerar renomear ou aliasing os baixos 8 registos para r0- r7, ou usar UAX, em vez de r8, etc . "Descobrir como nomear melhor os registros foi, na verdade, uma das partes mais difíceis de fazer a extensão de registros". (Consulte stackoverflow.com/a/35619528/224132 para obter outro histórico interessante do x86-64.) Além disso, o pedido não é RAX / RBX / ... na codificação binária, é AX, CX, DX, BX
Peter Cordes
9

Nos processadores anteriores, nem todos os registros eram iguais:

  • Não havia espaço suficiente nos chips para ter uma unidade somadora para cada registro.
  • Com 8 bits, não havia códigos de operação suficientes disponíveis para todas as combinações possíveis de origem e destino.

Portanto, supondo que um registro específico sempre estivesse envolvido quando o adicionador estava envolvido, tornava o chip menos complexo e os códigos de operação mais curtos.

Por exemplo, o 6510 (usado no Commodore 64) só poderia adicionar usando o registro A e a indexação usada X ou Y. Existem instruções INC X e INC Y, mas não INC A.

Como os registros tinham diferentes usos, os mnemônicos foram escolhidos refletindo seu uso. Por exemplo, A, X e Y no 6510 (em vez de A, B e C).

Os nomes no 8086 são escolhidos para refletir seu uso também. Com quatro registros de uso geral, era lógico chamá-los de AX, BX, CX e DX. Registros de indexação adicionais foram chamados BP e SP (mnemônico: Ponteiro Base, Ponteiro de Pilha).

Como muitos opcodes foram estendidos para 16 bits, havia algum espaço para indicar qual dos quatro registradores era usado. No entanto, algumas das razões históricas ainda se aplicavam, pois o CX era um pouco especial: o REP e os gostos, que são opcodes de 8 bits, sempre usam o CX como contador. Um mnemônico simples, CX = Counter, ajuda a lembrar qual deles é usado.

Os códigos de operação para sucessores do 8086 precisavam ser compatíveis com versões anteriores e são uma bagunça como resultado dos códigos de operação de comprimento variável. Quando os barramentos de 32 bits se tornaram mais comuns, foram testados processadores com comprimento fixo de código de operação. Isso simplifica a parte de decodificação da CPU, que liberou espaço que poderia ser usado para, por exemplo, mais registros.

Os processadores que seguiram essa linha de pensamento são chamados de processadores RISC (CPU do conjunto de instruções reduzido), para contrastar com o CISC (CPU do conjunto de instruções complexo).

Mais registros resultam em menos transbordamento para a memória. Basicamente, os registros são o cache mais rápido disponível, portanto, aumentar o número de registros é uma boa idéia, mesmo hoje em dia. A falta de instruções especializadas foi (espero que mais do que) compensada pelo rápido envio de instruções simples.

Opcodes de comprimento fixo de 32 bits têm espaço suficiente para incluir uma fonte, uma segunda fonte, uma operação e um destino. O SPARC conseguiu torcer 5 bits para cada fonte, segunda fonte e destino e, portanto, tinha 32 registros visíveis ao mesmo tempo.

32 registros são demais para usar letras, e eles eram praticamente iguais de qualquer maneira, portanto, numerá-los era a escolha óbvia. O 'R' foi usado para distingui-los das constantes 0..31 e 'R' foi um mnemônico fácil para o Register. Portanto: R0..R31.

Ao longo dos anos, o Pentium e seus sucessores mantiveram compatibilidade com versões anteriores. No entanto, muitas das idéias mais bem-sucedidas do RISC também foram incorporadas. Freqüentemente, essas novas instruções do tipo RISC serão executadas mais rapidamente do que as versões compatíveis com versões anteriores.

O número de registros também foi aumentado pela Intel, para reduzir o número de acessos à memória.

E, aparentemente, a Intel finalmente começou a usar a notação R. A compatibilidade com versões anteriores garantirá que o AX, o BX, ... permaneçam, mas eu apostaria que o AX é apenas um sinônimo para, por exemplo, R0.


Isenção de responsabilidade : A descrição acima é minha visão da história. Será incompleto, pois eu não estava por perto para testemunhar as partes anteriores da história em primeira mão. No entanto, espero que seja útil para alguns.

Sjoerd
fonte
1
A família 6500 realmente não precisava de uma instrução dedicada para incrementar o acumulador, porque uma adição de modo imediato 1 levou os mesmos dois ciclos que um INXou INY, embora o código ocupasse um byte adicional. Eu escrevi muita montagem para esse chip e, na prática, esse tipo de incremento era raro fora da matemática que era necessária.
Blrfl
@ Blrfl Você está certo: ADD 1funciona, portanto não havia necessidade de um 'Aumento especializado' especializado. E não me lembro de precisar também.
Sjoerd
1
Note-se que não foi a Intel que aumentou o número de registros em x64 e os nomeou, mas a AMD, pois as extensões de 64 bits para x86 foram criadas pela AMD . O design de 64 bits da Intel foi o Itanium , que não se saiu tão bem, embora eles tenham colocado muitos (128 inteiros de uso geral, além de muitos outros) de registros.
8bittree
5

Significa apenas 'registrar'. Por razões históricas.

Mike Nakis
fonte
Não é realmente tão histórico se atualmente se refere a um registro, não é? Eu diria que os outros nomes para registros (AX, EAX etc.) são mais por razões históricas. Mas que o "R" no RAX é atualmente muito aplicável.
Carl G
1
(+1) meme: "Se você pode explicar por muito tempo, pode explicar em breve."
user7813604