Bytebeat

From Noisebridge
(Difference between revisions)
Jump to: navigation, search
(Cleaning up the 240-byte bytebeat I previously posted.)
Line 62: Line 62:
  
 
<nowiki>
 
<nowiki>
### Basic Sierpinski harmony bytebeat t & t >> 8 in as few bytes as possible:
+
### Basic Sierpinski harmony bytebeat t & t >> 8 in as few bytes as possible:
        .globl _start
+
        .globl _start
_start: inc %ebx            # output fd 1 in %ebx for write()
+
_start: inc %ebx            # output fd 1 in %ebx for write()
inc %edx            # byte count of 1 in %edx for write()
+
        inc %edx            # byte count of 1 in %edx for write()
loop:  inc %eax            # increment t each time through the loop
+
loop:  inc %eax            # increment t each time through the loop
        push %eax            # save it on the stack
+
        push %eax            # save it on the stack
        and %ah, %al        # compute t & t >> 8, our output sample
+
        and %ah, %al        # compute t & t >> 8, our output sample
        push %eax            # store it on the stack for write()
+
        push %eax            # store it on the stack for write()
        lea 3(%ebx), %eax    # a three-byte way to set %eax to 4 (__NR_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!)
+
        mov %esp, %ecx      # pass sample pointer to write() (little-endian!)
        int $0x80            # invoke system call
+
        int $0x80            # invoke system call
        pop %eax            # discard sample
+
        pop %eax            # discard sample
        pop %eax            # restore t into %eax
+
        pop %eax            # restore t into %eax
        jmp loop            # and repeat
+
        jmp loop            # and repeat
### Kragen Javier Sitaker
+
### Kragen Javier Sitaker
### 2012-01-10
+
### 2012-01-10
 
</nowiki>
 
</nowiki>
 +
 +
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.

Revision as of 21:39, 22 February 2012


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

Personal tools