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.463 ]
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
"Clear Screen" para Linux x86 com Inline Assembly (embutido no código) em C
codigo em assembley que soma dois numeros
Algoritmo de Raiz Quadrada Inteira em Assembly Puro para Linux x86 (NASM - Netwide Assembler)
Retorna a diferença entre dois vetores em Assemly
Nenhum comentário foi encontrado.
Agora temos uma assistente virtual no fórum!!! (247)
Manutenção de sistemas Linux Debian e derivados com apt-get, apt, aptitude e dpkg
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
Como Atualizar Fedora 39 para 40
Instalar Google Chrome no Debian e derivados
Consertando o erro do Sushi e Wayland no Opensuse Leap 15
Instalar a última versão do PostgreSQL no Lunix mantendo atualizado
Flathub na sua distribuição Linux e comandos básicos de gerenciamento
redirecionando saida de comando touch para o AWK[AJUDA] (3)
Impressora Canon Ip 1800 (Drivers) 64 bit (5)