Ir para conteúdo

Duvida Sobre Registradores de Propósito Geral - Intel 64 e uso do NASM.


Samuel Araujo

Posts Recomendados

Olá, estou dando uma olhada no livro de Programação em baixo nível, do Ygor Zhirkov, e um trecho me chamou a atenção.
Ele disse que os registradores de Propósito Geral da arquitetura Intel 64 são nomeados de r0 à r15, e por uma razão histórica eles recebem os nomes alternativos (que estamos acostumados a usar) de rax, rcx, rdx...Por exemplo, r1 é chamado de rcx pela razão do seu uso em instruções de ciclos , como a "loop", por isso rCx (C de cyclo).

Até ai tudo bem, tudo faz sentido e nada fora do normal. Porém, fui tentar substituir as nomenclaturas de rax por r0 // r1 por rcx etc..E o NASM não aceitou, ALGUÉM SABE SE É POSSÍVEL FAZER ESSA SUBSTITUIÇÃO NO NOME DOS REGISTRADORES? Mais informações sobre o assunto, eu ficaria agradecido.

Eu dei uma pequena olhada no manual da intel 64 e não encontrei essas referências de:
rax == r0
rcx == r1
rdx == r2
rbx == r3
rsp == r4
rbp == r5
rsi == r6
rdi == r7
r8 à r15 (esses são usados normalmente).

A causa disso é que não é aceito devido ao NASM?
Qualquer informação é aceita.
OBS: É o NASM do Linux para a arquitetura x86-64.

Link para o comentário
Compartilhar em outros sites

Oi @Samuel Araujo. Essa contagem faz sentido e é exatamente o motivo de o registrador r8 ser o r8. 🙂 Em arm por exemplo, ela é utilizada.

No entanto, em amd64 os nomes originais foram mantidos acredito que porque preservam a ideia de sua função e também facilita pra quem já sabia i386. Por exemplo, rcx é o contador e por aí vai. Ninguém (?) usa a nomenclatura de r0 a r7 em amd64 mas o nasm a suporta sim: basta usar as macros definidas no pacote altreg no início do seu código. Veja:

bits 64

%use altreg

SYS_WRITE equ 1
STDOUT    equ 1
SYS_EXIT  equ 60

section .rodata

msg:
 db `Registradores alternativos!\n`
 msg_len equ $ - msg

section .text

global _start
_start:
 mov r0, SYS_WRITE
 mov r7, STDOUT
 lea r6, [msg]
 mov r2, msg_len
 syscall

 mov r0, SYS_EXIT
 xor r7, r7
 syscall

Usar o pacote altreg é como definir os novos nomes você mesmo. Algo como %define r0 rax, embora o nasm use %idefine no pacote altreg, que faz a definição ficar insensível ao caso, permitindo R0, r0, RAX, rax, rAX, etc. Mais detalhes no arquivo macros/altreg.mac.

Isso é só nome e só faz sentido no código-fonte. A instrução gerada no compilado é a mesma, quer você use r0, quer você use rax. O fonte vai ficar confuso já que ninguém (?) tá acostumado com isso em amd64. Além disso, tem que decorar a ordem. Perceba que o segundo registrador é rcx, não o rbx. A ordem é A, C, D, B. Depois vem o SP, BP, SI e DI. Lembrar disso "numericamente" representa uma dificuldade adicional, mas é possível claro.

Abraço.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...