Escrita de número em octal em Assembly puro para Linux 64 bits (NASM - Netwide Assembler)

Publicado por Perfil removido (última atualização em 22/06/2015)

[ Hits: 2.032 ]

Download oct_64-001.asm




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.

Semelhante à primeira versão, este código utiliza-se da pilha para a reordenação dos dígitos após as divisões sucessivas.

Também escrito para usar variáveis globais, não tão adequadas ou elegantes como variáveis locais ou a pilha, visando facilitar a compreensão e uma visão intuitiva do programa.

Conforme os restos das divisões são obtidos, serão empilhados, sendo acrescidos do endereço inicial da string "digit", de modo que o valor empilhado aponta exatamente - é um endereço de memória, vulgo ponteiro - para o dígito que deve ser impresso.

Conforme são desempilhados os valores, os dígitos vão sendo impressos.

O último item a ser desempilhado é um ponteiro para o "new line" armazenado ao final do código.

Este caractere identifica o final 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 ficam visíveis no uso das interrupções, chamadas de interrupções 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:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;   nasm -f elf64 oct_64-001.asm
;   ld -s oct_64-001.o -o oct_64-001
;   a opção -s no linkeditor faz
;    "strip -s" automaticamente
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

section .text
global      _start

_start:

    push    nl
    mov     rax,    valor

_empilha:

    xor     rdx,    rdx
    mov     rcx,    8
    div     rcx
    add     rdx,    digit
    push    rdx
    cmp     rax,    0
    jg      _empilha

_escreve:

    mov     rax,    1
    mov     rdi,    1
    pop     rsi
    mov     rdx,    1
    syscall

    cmp     rsi,    nl
    jne     _escreve

_fim:

    mov     rax,    60
    mov     rdi,    0
    syscall

section     .rodata

    digit   dq  "01234567"
    nl      dq  `\n`
    valor   equ 4952488

Scripts recomendados

Soma dois números lidos da memória

Escrita de um número em decimal na tela em Assembly Puro para Linux x86 (Nasm - Netwide Assembly)

Simples JIT (just in time) em C

Escrita de um número em octal na tela em Assembly Puro para Linux x86 (GNU Assembly)

Retorna o maior e menor elemento de um vetor em Assembly


  

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