Jump to content

Samuel Araujo

Members
  • Posts

    3
  • Joined

  • Last visited

Samuel Araujo's Achievements

1

Reputation

  1. 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.
  2. Uauu, que honra o Fernando comentando meu erro!!!Muito obrigado, agora tudo faz sentido..Agr que vc falou se n me engano vc cita em alguma aula do curso de C que o ultimo caractere é o de nova linha, acho que é a aula sobre array, n lembro...Eu acompanho o mente binaria faz 2 anos já, vcs me influenciaram a aprender programação, e não só isso...Me deram um caminho para aprender pelo baixo nível...fiquei 9 mêses estudando o livro de Arquitetura e Organização de Computadores do Willian Stalins, e agr comecei a estudar a matéria de programação, capengando com erros e pesquisas, estudos..Mas é isso, continue com o projeto e muito obrigado novamente.
  3. Olá, sou um autodidata que esta estudando assembly nasm x86-64 e C. Estou fazendo um programa para treinar meus conhecimentos em C e assembly, o código que estou com erro será uma função em assembly que vou chamar em C, porém isso não é relevante ao erro, vou tratar o código aqui como se fosse um programa individual. Meu erro acontece quando eu tento validar a entrada do usuário de números inteiros de 1 a 9, porém primeiro eu tento valida-las como caractere, as condições de validação nunca são atendidas e meu programa entra em loop quase infinito, alguém me ajuda?? Por favor!!!!!! Cóidigo: Bits 64 section .data msg db 'Você digitou um caracterer ou valor invalido para a operação!', 0xA, 'por favor digite apenas números inteiros de 1 a 9.', 0xA tam5 equ $-msg msg1 db 'Digite (1) para realizar a operação novamente:', 0xA tam6 equ $-msg1 msg3 db 'Deu bom garoto', 0xA tam7 equ $-msg3 section .bss user1 resb 21 tam1 equ $-user1 user2 resb 1 tam2 equ $-user2 section .text global _start _start: mov rax, 0 mov rdi, 0 mov rsi, user1 mov rdx, tam1 syscall ; vamos pegar a entrada do usuario em caractere e armazenar no endereço de user1. xor rcx, rcx ; limpei rcx para a operação seguinte. /* No procedimento seguinte esta meu erro, não importa oque eu faça o caractere nunca é validado e sempre salta para o procedimento invalido, onde entra quase em um loop infinito eu ja tive o mesmo problema com saltos em outros programas testes que eu faço para treinar. acredito que o erro esteja na entrada do usuario, mas relamente n consigo entender*/ verifica: mov rax, user1 ; movi para rax o endereço da entrada do usuario mov al, [rax + rcx] /* Estou movendo o valor do byte menos significativo, que esta em uma posição de memória resultante da operação que fiz com o endereço que esta em rax + rcx. Aqui eu levo em consideração que cada caractere de 1-9 contem sua representação em 1 byte, o grande problema vem a seguir */ cmp al, 0 je valido ; compara com nullo (fim da entrada do usuario) e salta pro fim do programa cmp al, '0' jl invalido ; compara se é menor que a representação do caractere 0. cmp al, '9' jg invalido ; compara se é menor que a representação do caractere 9. inc rcx jmp verifica invalido: mov rax, 1 mov rdi, 1 mov rsi, msg mov rdx, tam5 syscall mov rax, 1 mov rdi, 1 mov rsi, msg1 mov rdx, tam6 syscall mov rax, 0 mov rdi, 0 mov rsi, user2 mov rdx, tam2 syscall xor rax, rax mov rax, user2 mov al, [rax] cmp al, '1' je _start mov rax, 60 mov rdi, 0 syscall valido: mov rax, 1 mov rdi, 1 mov rsi, msg3 mov edx, tam7 syscall mov rax, 60 mov rdi, 0 syscall Meu código.txt
×
×
  • Create New...