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.843 ]
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 (Nasm - Netwide Assembler)
Retorna a diferença entre dois vetores em Assemly
Intercessão entre dois vetores em Assembly
Relógio em assembly NES 8 bits (variante do 6502)
Retorna o maior e menor elemento de um vetor em Assembly
Nenhum comentário foi encontrado.
Atualizações de Apps, Desktop e Kernel agitam o ecossistema Linux nesta terça-feira
Miyoo Mini Plus + Onion OS (Linux)
IA local no bolso, novo visual no Raspberry Pi OS e mais destaques do software livre
Kernel turbinado, compatibilidade em alta e debate sobre sustentabilidade: o dia no mundo Linux
Kernel turbinado e GNOME 49 dominam o giro do dia no mundo Linux
Adicionando o repositório backports no Debian 13 Trixie
Como definir um IP estático no Linux Debian
Como listar os arquivos em "bloquin... [RESOLVIDO] (5)
Como colocar atalho para uma pasta na área de trabalho do Ubuntu 24.04... (1)
Como vencer a procrastinação? (8)
Adicional de convivdado em linux somente linha de comando (3)