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.349 ]
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
Escrita de um número em hexadecimal na tela em Assembly Puro para Linux x86 (Nasm - Netwide Assemble
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
Nenhum comentário foi encontrado.
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
Instalar e Configurar o Slackware Linux em 2025
Como configurar os repositórios do apt no Debian 12 em 2025
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Muitas dificuldades ao instalar distro Linux em Notebook Sony Vaio PCG-6131L (VPCEA24FM)
Slackpkg+ (Slackpkg Plus) está de volta!
Como dividir duas janelas igualmente e lado-a-lado na sua tela
Configurando o Conky para iniciar corretamente no sistema
3 configurações básicas que podem melhorar muito a sua edição pelo editor nano
Youtube e networkmeneger para de funcionar (5)
Minha rede tem um espaço invisível que não dá pra digitar o nome da re... (1)
Pedagogia no brasil não passa de alfabetização por m4sturbação mental ... (2)
compilação samba 4.22 rock linux 9.5 (3)
Erro de segmentação «Segmentation fault (core dumped)» ao retornar obj... (7)