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

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

Soma dois números lidos da memória

FreeBSD Write

Retorna o maior e menor elemento de um vetor em Assembly

Algoritmo de Raiz Quadrada Inteira em Assembly Puro para Linux x86 (NASM - Netwide Assembler)

Inverter uma string, Assembly8086


  

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