Crivo de Eratóstenes Simples para Linux x86 em Assembly Puro (GNU Assembler)
Publicado por Perfil removido (última atualização em 19/02/2015)
[ Hits: 2.272 ]
Observações:
1. Após a linkedição, o binário ocupa 26KB; após "strip -s" ocupa 25KB. É muito grande se comparado aos menos de 4KB que poderia ocupar se feito em C.
2. Esse tamanho considerável é devido ao modo como foram alocados os valores calculados pelo crivo.
3. Feito para 32 bits.
4. Para não correr risco de overflow, esta versão trabalha apenas com os primos do intervalo de 1 até 2^16-1 ( = 65535).
5. Foi usado um truque para não ser calculada diretamente a raiz quadrada.
6. Após os cômputos, ele escreve os números encontrados na tela.
############################################## # Comentários: ############################################## # # as sieve001.s -o sieve001.o # ld sieve001.o -o sieve001 # strip -s sieve001 # ./sieve001 # ############################################## .comm s 24545 .space 24545 .section .rodata digit: .ascii "0123456789" bl: .ascii " " nl: .ascii "\n" .section .data i: .long 5 j: .long 0 k: .long 1 l: .long 0 p: .long 65535 # q: .long 6541 # .section .text .global _start _start: call _inicializa call _crivo call _escreve call _fim _inicializa: xorl %ecx, %ecx movl $2, s(,%ecx, 4) incl %ecx movl $3, s(,%ecx, 4) _I0: incl %ecx movl $1, s(,%ecx, 4) cmpl q, %ecx jl _I0 ret _crivo: movl k, %ecx cmpl q, %ecx jge _C0 movl i, %ecx cmpl p, %ecx jge _C0 movl $0, j call _raiz call _proximo jmp _crivo _C0: ret _raiz: xorl %edx, %edx movl j, %ecx movl s(,%ecx, 4),%eax mull %eax cmpl i, %eax je _R0 jg _R1 call _teste movl l, %eax cmpl $0, %eax je _R0 incl j jmp _raiz _R1: call _adiciona _R0: ret _teste: xorl %edx, %edx movl $0, l movl i, %eax movl j, %ebx movl s(,%ebx, 4),%ecx divl %ecx movl %edx, l ret _adiciona: incl k movl k, %ecx movl i, %eax movl %eax, s(,%ecx, 4) ret _proximo: movl i, %eax movl $3, %ecx divl %ecx addl $2, i cmpl $2, %edx je _S2 addl $2, i _S2: ret _escreve: movl $0, j _E0: movl j, %ebx movl s(,%ebx, 4),%eax cmpl $1, %eax je _E1 cmpl q, %ebx jg _E1 incl j pushl $bl jmp _E2 _E1: pushl $nl jmp _E3 _E2: xorl %edx, %edx movl $10, %ecx divl %ecx addl $digit, %edx pushl %edx cmpl $0, %eax jg _E2 _E3: movl $4, %eax movl $1, %ebx popl %ecx movl $1, %edx int $0x80 cmpl $bl, %ecx je _E0 cmpl $nl, %ecx je _E4 jmp _E3 _E4: ret _fim: movl %eax, %ebx movl $1, %eax int $0x80
Retorna o maior elemento de um vetor
Soma dois números lidos da memória
codigo em assembley que soma dois numeros
Escrita de um número em decimal na tela em Assembly Puro para Linux 64 bits (GNU Assembly)
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Arch Linux - Guia para Iniciantes (2)
Problemas ao instalar o PHP (11)
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)