Escrita de número em binário em Assembly Puro para Linux 64 bits (Nasm - Netwide Assembler)
Publicado por Perfil removido (última atualização em 18/03/2013)
[ Hits: 3.590 ]
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-binario-na-tela-em-Assembly-Puro-para-Li...
Esta versão foi criada no formato de 64 bits, para criação de objeto e linkedição em formato ELF64.
Semelhante ao outro, 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 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 bin_64-001.asm ; ld -s bin_64-001.o -o bin_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, 2 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 "01" nl dq `\n` valor equ 4952488
Escrita de um número em octal na tela em Assembly Puro para Linux x86 (GNU Assembly)
Escrita de número em hexadecimal em Assembly Puro para Linux 64bits (Nasm - Netwide Assemble)
Escrita de um número em decimal na tela em Assembly Puro para Linux x86 (Nasm - Netwide Assembly)
Escrita de um número em octal na tela em Assembly Puro para Linux x86 (Nasm - Netwide Assembler)
Nenhum comentário foi encontrado.
Melhorando o tempo de boot do Fedora e outras distribuições
Como instalar as extensões Dash To Dock e Hide Top Bar no Gnome 45/46
E a guerra contra bots continua
Tradução do artigo do filósofo Gottfried Wilhelm Leibniz sobre o sistema binário
Conheça o firewall OpenGFW, uma implementação do (Great Firewall of China).
Instalando o FreeOffice no LMDE 6
Anki: Remover Tags de Estilo HTML de Todas as Cartas
Colocando uma opção de redimensionamento de imagem no menu de contexto do KDE
Debian Bookworm para a versão beta Debian 13 Trixie (3)
Não consigo acessar os modos de desempenho (5)
Alguém pode me ajudar porfavor como executar comandos ao iniciar no i3... (2)
[Shell Script] Script para desinstalar pacotes desnecessários no OpenSuse
[Shell Script] Script para criar certificados de forma automatizada no OpenVpn
[Shell Script] Conversor de vídeo com opção de legenda
[C/C++] BRT - Bulk Renaming Tool
[Shell Script] Criação de Usuarios , Grupo e instalação do servidor de arquivos samba