Samuel Araujo Postado Setembro 19, 2023 em 23:32 Compartilhar Postado Setembro 19, 2023 em 23:32 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Administradores Fernando Mercês Postado Setembro 20, 2023 em 08:17 Administradores Compartilhar Postado Setembro 20, 2023 em 08:17 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados
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.