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.174 ]
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
Quadrado de um número em assembly
Escrita de número em octal em Assembly puro para Linux 64 bits (NASM - Netwide Assembler)
Escrita de um número em binário na tela em Assembly Puro para Linux 64 bits (GNU Assem
Nenhum comentário foi encontrado.
tux-gpt - Assistente de IA para o Terminal
Instalação e configuração do Chrony
Programa IRPF - Guia de Instalação e Resolução de alguns Problemas
O Que Fazer Após Instalar Ubuntu 25.04
O Que Fazer Após Instalar Fedora 42
Debian 12 -- Errata - Correções de segurança
Instalando o Pi-Hole versão v5.18.4 depois do lançamento da versão v6.0
Liberação de alguns links no squid (23)
NAT LoopBack - Hairpin NAT (1)
Alguém poderia me ajudar a escolher peças pra montar um desktop? (14)