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.620 ]
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
Relógio em assembly NES 8 bits (variante do 6502)
Escrita de um número em decimal na tela em Assembly Puro para Linux x86 (Nasm - Netwide Assembly)
GAS "Hello World" o número de vezes definido pelo usuário
Nenhum comentário foi encontrado.
Instalação Completa e Configuração Básica do Void Linux
A Fundação da Confiança Digital: A Importância Estratégica de uma PKI CA na Segurança de Dados
Como enviar dicas ou artigos para o Viva o Linux
Como Ativar a Aceleração por GPU (ROCm) no Ollama para AMD Navi 10 (RX 5700 XT / 5600) no Gentoo
Samba 4 AD-DC 2026: Backup & Restore
Samba 4 AD-DC 2026: LAPS (Randomizando senhas locais).
Cairo Dock ainda funcional nos dias de hoje
Configuração de IP fixo via nmcli e resolução de nomes via /etc/hosts no Gentoo
Linus Torvalds e Bill Gates se encontram pela primeira vez (4)
Criar conta no Google [RESOLVIDO] (3)
Alguém conhece ou indica? [RESOLVIDO] (6)
Não consigo instalar as bibliotecas em Python pelo terminal. (3)









