Samuel Araujo Posted September 19, 2023 at 11:32 PM Share Posted September 19, 2023 at 11:32 PM 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. Quote Link to comment Share on other sites More sharing options...
Fernando Mercês Posted September 20, 2023 at 08:17 AM Share Posted September 20, 2023 at 08:17 AM 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. 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.