Escrita de número em decimal em Assembly Puro para Linux 64 bits (Nasm - Netwide Assembler)
Publicado por Perfil removido (última atualização em 27/07/2015)
[ Hits: 2.356 ]
A primeira versão deste código foi criada no formato de 32 bits:
http://www.vivaolinux.com.br/script/Escrita-de-um-numero-em-decimal-na-tela-em-Assembly-Puro-para-Li...
Esta versão está no formato de 64 bits, para criação de objeto e linkedição em formato ELF64.
Semelhante à primeira, este código utiliza-se da pilha para a reordenação dos dígitos após as divisões sucessivas.
Também escrito para usar variáveis globais, não tão adequadas ou elegantes como variáveis locais ou a pilha, visando facilitar a compreensão e uma visão intuitiva do programa.
Conforme os restos das divisões são obtidos, serão empilhados, sendo acrescidos do endereço inicial da string "digit", de modo que o valor empilhado aponta exatamente - é um endereço de memória, vulgo ponteiro - para o dígito que deve ser impresso.
Conforme são desempilhados os valores, os dígitos vão sendo impressos.
O último item a ser desempilhado é um ponteiro para o "new line" armazenado ao final do código.
Este caractere identifica o final da escrita dos dígitos, feita através de um cmp (comparação).
As diferenças entre a versão de 32 bits e a de 64 bits ficam visíveis no uso das interrupções, chamadas de interrupções e registradores.
- Interrupção de escrita 32 bits = 4
- Interrupção de escrita 64 bits = 1
- Interrupção de encerramento 32 bits = 1
- Interrupção de encerramento 64 bits = 60
- Chamada de interrupção 32 bits = "int 0x80"
- Chamada de interrupção 32 bits = "syscall"
- Registradores usados no código com interrupções de 32 bits = eax. ebx, ecx, edx
- Registradores usados no código com interrupções de 64 bits = rax. rdi, rsi, rdx
No caso dos registradores, percebe-se que em 64 bits houve uma pequena mudança na analogia usual.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Comentários: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; nasm -f elf64 dec_64-001.asm ; ld -s dec_64-001.o -o dec_64-001 ; a opção -s no linkeditor faz ; "strip -s" automaticamente ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; section .text global _start _start: push nl mov rax, valor _empilha: xor rdx, rdx mov rcx, 10 div rcx add rdx, digit push rdx cmp rax, 0 jg _empilha _escreve: mov rax, 1 mov rdi, 1 pop rsi mov rdx, 1 syscall cmp rsi, nl jne _escreve _fim: mov rax, 60 mov rdi, 0 syscall section .rodata digit dq "0123456789" nl dq `\n` valor equ 4952488
codigo em assembley que soma dois numeros
Nenhum comentário foi encontrado.
Como Ativar a Aceleração por GPU (ROCm) no Ollama para AMD Navi 10 (RX 5700 XT / 5600) no Gentoo
Como criar um make.conf no Gentoo (para iniciantes)
Como instalar o Open WebUI para Ollama no Gentoo (com systemd)
INSTALAR (e jogar) COUNTER STRIKE 1.6 (install cs 1.6) NO LINUX
Removendo o bloqueio por erros de senha no Gentoo (systemd)
Papel de Parede Animado no KDE Plasma 6 (Com dicas para Gentoo)
Homebrew: o gerenciador de pacotes que faltava para o Linux!
Removendo a trava de versão do Project Brutality para GZDoom/UZDoom
Acelere a compilação no Gentoo com distcc (guia para Systemd)









