Jump to content

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


Samuel Araujo

Recommended Posts

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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...