Escrita de um número em octal na tela em Assembly Puro para Linux 64 bits (GNU Assembler)
Publicado por Perfil removido (última atualização em 09/10/2015)
[ Hits: 3.576 ]
Este pequeno programa em Assembly tem uma antiga versão em formato de 32 bits:
http://www.vivaolinux.com.br/script/Escrita-de-um-numero-em-octal-na-tela-em-Assembly-Puro-para-Linu...
Esta versão está no formato 64 bits, para criação de objeto e linkedição em formato ELF64.
De modo semelhante à primeira versão, o código usa a pilha para a reordenação dos dígitos após a sequência de divisões.
Também foi escrito para usar variáveis globais, que não são tão adequadas ou elegantes como variáveis locais ou a pilha, visando facilitar a compreensão e dar uma visão mais intuitiva ao programa.
Conforme os restos sucessivos são obtidos, são empilhados, sendo ainda acrescidos do endereço inicial da string "digit", de modo que o valor empilhado aponta exatamente - é um endereço de memória, um ponteiro mesmo - para o dígito que será impresso.
Conforme vão sendo desempilhados, os dígitos são impressos.
O último item desempilhado é um ponteiro para o caractere "new line" armazenado ao final do código.
Este caractere identifica o fim 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 são notadamente visíveis no uso das interrupções, modo de chamá-las 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: ############################################################################################ # # as oct_64-001.s -o oct_64-001.o # ld -s oct_64-001.o -o oct_64-001 # a opção -s no linkeditor faz # "strip -s" automaticamente # ############################################################################################ .section .rodata digit: .ascii "01234567" nl: .ascii "\n" valor: .quad 4952488 .section .text .globl _start _start: pushq $nl movq valor, %rax _empilha: xorq %rdx, %rdx movq $8, %rcx divq %rcx addq $digit, %rdx pushq %rdx cmpq $0, %rax jg _empilha _escreve: movq $1, %rax movq $1, %rdi popq %rsi movq $1, %rdx syscall cmpq $nl, %rsi jne _escreve _fim: movq $60, %rax movq $0, %rdi syscall
Algoritmo de Raiz Quadrada Inteira em Assembly Puro para Linux x86 (GNU Assembler)
Escrita de um número em octal na tela em Assembly Puro para Linux x86 (Nasm - Netwide Assembler)
"Clear Screen" para Linux x86 em Assembly Puro (GNU Assembly)
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Criando uma VPC na AWS via CLI
Multifuncional HP imprime mas não digitaliza
Dica básica para escrever um Artigo.
Como Exibir Imagens Aleatórias no Neofetch para Personalizar seu Terminal
Instalação Uefi com o instalador clássico do Mageia [RESOLVIDO] (2)
Melhorando a precisão de valores flutuantes em python[AJUDA] (11)
GLPI - Configuração de destinatário com conta Microsoft Exchange (0)