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.470 ]

Download oct_64-001.s




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.

  



Esconder código-fonte

############################################################################################
#       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

Scripts recomendados

"Clear Screen" para Linux x86 com Inline Assembly (embutido no código) em C

GAS Uppercase

Crivo de Eratóstenes Simples para Linux x86 em Assembly Puro (GNU Assembler)

Escrita de número em decimal em Assembly Puro para Linux 64 bits (Nasm - Netwide Assembler)

Escrita de número em hexadecimal em Assembly Puro para Linux 64bits (Nasm - Netwide Assemble)


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts