Linux slogan
Visite também: Segurança Linux · BR-Linux.org · Dicas-L · Doode · NoticiasLinux · SoftwareLivre.org · UnderLinux



» Screenshot
» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha



Scripts

Linux user

Publicado por Listeiro 037 em (última atualização em 15/04/2013)   [ 2854 hits ]

Login: Listeiro 037, 191144 pontos

Download:

Versão 2:

Versão 3:

Versão 4:


Descrição

Método semelhante à da escrita em decimal do outro código.

A diferença é a de trocar a string dos caracteres de escrita decimal "0123456789" pela string dos caracteres de escrita em hexadecimal "0123456789abcdef".

E trocar o valor do divisor, que é 10, por 16.


[ Download: hexadecimal001.s ]   [ Enviar nova versão ]

Versões atualizadas deste script (NOVO)
Linux user

Publicado por Listeiro 037 em 29/07/2012

Changelog: Esta segunda implementação usa deslocamento para a direita (shr) e operação "E" (and) para encontrar os valores da conversão ao invés de dividir o número por 16.

Revisando o primeiro código:

Os valores encontrados eram armazenados numa pilha. O primeiro valor a ser armazenado na pilha é o de impressão de nova linha.

Quando os valores forem desempilhados, este marcará o fim da pilha e então cessará a impressão.

A pilha é necessária devido ao modo de como os valores são obtidos na divisão.

Sendo o primeiro resto considerado o último dígito a ser impresso, este deverá entrar primeiro na pilha, de modo que será o último depois que todos os que entraram depois deles forem desempilhados.

No primeiro código, o número era dividido por dois e ao resto da divisão era acrescido o endereço de uma string que continha os possíveis caracteres de impressão do intervalo de 0 a 9, mais as letras do intervalo 'a' ... 'f', que equivalem aos valores hexadecimais de 10 a 15.

Este valor é armazenado na pilha e será retirado no momento de impressão de caracteres, que será o desempilhamento.

De modo que será passada à interrupção de kernel o valor desempilhado, o endereço para a impressão de um caractere na posição da string deslocado tantas posições de memória quanto fosse o resultado do resto da divisão.

O quociente era então dividido novamente e segue-se repetidamente até que todas as divisões sejam feitas.

A partir deste ponto, os valores serão desempilhados e passados à chamada de kernel, que imprimirá o caractere um a um.

Diferença entre a primeira e a segunda implementação:

* Na primeira o que se efetua são divisões por 16, trabalhando-se com os restos como sinais a serem impressos e os quocientes divididos novamente.

* Na segunda implementação usa-se uma operação "E" (and) para saber apenas o valor do último bit do número. Após isto o bit é descartado com a operação de deslocamento à direita. O valor encontrado na operação "E" é acrescido do endereço da string e empilhado, sendo desempilhado quando for feita a impressão de dígitos.

Quociente de divisão por 16 = Deslocamento de quatro casas à direita.
Resto de divisão por 16 = Os bits que somem no deslocamento de quatro casas à direita.

(versão 2)

 

Linux user

Publicado por Listeiro 037 em 28/02/2013

Changelog: Este terceiro método de escrita não usa mais a string com os caracteres a serem usados na impressão.

É feita normalmente a sequência de divisões por 16 e acumulados os restos para impressão de caracteres.

Ao invés disso os caracteres são colocados diretamente na pilha.

Daí o endereço da pilha com o caractere é enviado ao registrador para ser usado na impressão de um único caractere.

Sendo repetido isto em loop, até ser encontrado por comparação o valor que identifica o final da série de caracteres, que é o "\ 0", o mesmo da linguagem C.

(versão 3)

 

Linux user

Publicado por Listeiro 037 em 28/02/2013

Changelog: Esta nova implementação combina parte do desenvolvimento das versões 2 e 3:

- Ao invés de usar a divisão (div), combina o deslocamento para a direita (shr) e operação "E" (and) para encontrar os valores da conversão.
- Os caracteres vão sendo colocados diretamente na pilha.
- O loop de impressão é interrompido ao ser encontrado o caractere nulo "\ 0", que é o mesmo de fim de string na linguagem C.

(versão 4)

 

[ Esconder código-fonte ]

############################################################################################
#      Comentários:
############################################################################################
#
#    as hexadecimal001.s -o hexadecimal001.o
#    ld -s hexadecimal001.o -o hexadecimal001
#    a opção -s no linkeditor faz
#     "strip -s" automaticamente
#
############################################################################################

.section      .rodata

   digit:   .ascii   "0123456789abcdef"
   nl:   .ascii   "\n"
   valor:   .long   4952488

.section   .text         
.globl       _start         

_start:   

   pushl   $nl
   movl   valor,   %eax

_empilha:

   xorl    %edx,   %edx
   movl   $16,   %ecx
   divl   %ecx
   addl   $digit,   %edx
   pushl   %edx
   cmpl    $0,    %eax
   jg    _empilha

_escreve:

   movl    $4,    %eax         
   movl    $1,    %ebx         
   popl    %ecx
   movl    $1,    %edx
   int    $0x80

   cmpl   $nl,   %ecx
   jne   _escreve

_fim:

   movl    %eax,    %ebx
   movl    $1,    %eax
   int    $0x80



Scripts recomendados
   Script Linux recomendado GAS Inteiro para String
   Script Linux recomendado GAS Uppercase
   Script Linux recomendado Fibonnaci de N em Assembly
   Script Linux recomendado Relógio em assembly NES 8 bits (variante do 6502)
   Script Linux recomendado Calcula ano de nascimento - C + Assembly

Comentários
[1] Comentário enviado por tiekookeit em 12/07/2012 - 14:35h:

nerdisse total kkkkkk



Contribuir com comentário


  
Para executar esta ação você precisa estar logado no site, caso contrário, tudo o que for digitado será perdido.
Responsável pelo site: Fábio Berbert de Paula - Conteúdo distribuído sob licença GNU FDL
Site hospedado por:

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.