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.687 ]
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
Escrita de um número em decimal na tela em Assembly Puro para Linux 64 bits (GNU Assembly)
Escrita de um número em hexadecimal na tela em Assembly Puro para Linux x86 (GNU Assembly)
Nenhum coment�rio foi encontrado.
Como aprovar Pull Requests em seu repositório Github via linha de comando
Como gerar um podcast a partir de um livro em PDF
Automatizando digitação de códigos 2FA no browser
Resolver problemas de Internet
Como compartilhar a tela do Ubuntu com uma Smart TV (LG, Samsung, etc.)
Como Definir o Painel Principal em Múltiplos Monitores no Linux Mint
Minecraft Launcher para Arch Linux
Instalar o Apache, MySQL e PHP no Oracle Linux 8
Resolvendo o erro "libQt6Widgets.so.6: cannot open shared object file" no Linux
aplicativos criados com webapp-manager não aparecem no menu do xfce (0)
Como bloquear e desbloquear papel de parede no Ubuntu 24.04 (1)