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 19/04/2013)   [ 2950 hits ]

Login: Listeiro 037, 190166 pontos

Download:

Versão 2:

Versão 3:


Descrição

Método semelhante à da escrita em binário do outro código.
A diferença é a de trocar a string dos caracteres de escrita binária "01" pela string dos caracteres de escrita em octal "01234567".
E trocar o valor do divisor, que é 2, por 8.



[ Download: octal001.asm ]   [ 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 8.

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

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 caracter 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 caracter um a um.

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

* Na primeira o que se efetua são divisões por 8, 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 8 = Deslocamento de três casas à direita.
Resto de divisão por 8 = Os bits que somem no deslocamento de três 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 8 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)

 

[ Esconder código-fonte ]

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;      Comentários:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;    nasm -f elf octal001.asm
;    ld -s octal001.o -o octal001
;    a opção -s no linkeditor faz
;     "strip -s" automaticamente
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

section   .text         
global       _start         

_start:   

   push    nl
   mov    eax,   valor

_empilha:

   xor    edx,   edx
   mov    ecx,   0x08
   div   ecx
   add   edx,   digit
   push    edx
   cmp    eax,   0x00
   jg    _empilha

_escreve:

   mov    eax,   0x04
   mov    ebx,   0x01         
   pop    ecx
   mov    edx,   0x01
   int    0x80

   cmp    ecx,   nl
   jne   _escreve

_fim:

   mov    eax,   0x01
   int    0x80

section      .rodata

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



Scripts recomendados
   Script Linux recomendado Retorna o maior elemento de um vetor
   Script Linux recomendado Hora do sistema
   Script Linux recomendado Fatorial em assembly
   Script Linux recomendado Escrita de um número em binário na tela em Assembly Puro para Linux x86 (Nasm - Netwide Assembler)
   Script Linux recomendado Escrita de um número em binário na tela em Assembly Puro para Linux x86 (GNU Assembly)

Comentários
[1] Comentário enviado por tiekookeit em 15/02/2013 - 08:29h:

Uma palavra para esse tópico

NERD

Adorei!



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.