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

Publicado por Perfil removido (última atualização em 02/09/2015)

[ Hits: 2.291 ]

Download 6226.hex_64-001.asm




A primeira versão deste código foi publicada no formato de 32 bits:

http://www.vivaolinux.com.br/script/Escrita-de-um-numero-em-hexadecimal-na-tela-em-Assembly-Puro-par...

Esta versão foi criada no formato de 64 bits, para criação de objeto e linkedição em formato ELF64.

Semelhante ao outro, 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 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 hex_64-001.o -o hex_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,   16
   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    "0123456789abcdef"
   nl      dq    `\n`
   valor   equ   4952488

Scripts recomendados

Assembler 8086 - Simples código que mostra horas e minutos em pontos

GAS Informações da CPU

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

ToUpperCase em Assembler 8086

Relógio em assembly NES 8 bits (variante do 6502)


  

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