Bytebeat

From Noisebridge
Revision as of 21:39, 22 February 2012 by 190.49.225.186 (talk) (Cleaning up the 240-byte bytebeat I previously posted.)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

 ; noise.asm -- just fooling around :-)
 ; mct and leif, ; Sun Feb 19 19:08:13 PST 2012
 ; 
 ; Build with:
 ;
 ;       nasm -felf32 noise.asm
 ;       ld -melf_i386 -o noise noise.o
 ;
 ; Run with:
 ;
 ;       ./noise | aplay

 global _start

 section .data

 section .bss

         var:    resb 1  ; one bye variable

 section .text

         ; f(x) = (x >> 10 ^ x>>((x>>13)%4)) % 256

         _start: mov esi, 0

                 ;int 3

         .loop: 

                 mov edi, esi
                 shr edi, 13 ; edi := x >> 13

                 mov eax, edi
                 cwd
                 mov bx, 4
                 div bx  ; dx := (x >> 13) % 4

                 mov eax, esi
                 mov cx, dx
                 shr eax, cl   ; eax := x >> ((x >> 13) % 4)

                 mov edi, esi
                 shr edi, 10   ; edi := x >> 10

                 xor eax, edi
                 mov [var], al

                 mov eax, 4      ; sys_write
                 mov ebx, 1      ; stdout
                 mov ecx, var    ; buffer
                 mov edx, 1      ; length
                 int 80h         ; syscall

                 inc esi
                 jmp .loop
 
python -c'import sys;[sys.stdout.write(chr((t>>10^t>>(t>>13)%4)%256)) for t in xrange(2**20)]' |aplay

### Basic Sierpinski harmony bytebeat t & t >> 8 in as few bytes as possible: .globl _start _start: inc %ebx # output fd 1 in %ebx for write() inc %edx # byte count of 1 in %edx for write() loop: inc %eax # increment t each time through the loop push %eax # save it on the stack and %ah, %al # compute t & t >> 8, our output sample push %eax # store it on the stack for write() lea 3(%ebx), %eax # a three-byte way to set %eax to 4 (__NR_write) mov %esp, %ecx # pass sample pointer to write() (little-endian!) int $0x80 # invoke system call pop %eax # discard sample pop %eax # restore t into %eax jmp loop # and repeat ### Kragen Javier Sitaker ### 2012-01-10

Compile with gcc -nostdlib and pipe the output to aplay. After stripping, the ELF is 240 bytes; size(1) says it has 18 bytes of code.