// Assembly for Linux i386 // to build: gcc -m32 -nostdlib -o fizzbuzz fizzbuzz.s .global _start .data // buffer for prnum prbuf: .ascii "##########" .text // strings for fizzbuzz fizz: .ascii " fizz\n" buzz: .ascii " buzz\n" fizzbuzz: .ascii " fizzbuzz\n" // prints numbers to the console prnl: pushal pushfl // get arg from stack movl 40(%esp), %eax // ready up movl $prbuf, %ebp movl $10, %ecx movl $9, %edi prnl_loop: // make sure edx is clear and do the division xor %edx, %edx divl %ecx // convert remainder to ascii and copy to buffer addb $48, %dl movb %dl, (%ebp,%edi,1) // decrement buffer index decl %edi cmpl $0, %eax jne prnl_loop // set up write syscall movl $4, %eax movl $1, %ebx leal 1(%ebp,%edi,1), %ecx movl $9, %edx subl %edi, %edx int $0x80 popfl popal ret _start: mov $0, %esi loop: // get modulo for 5, store in %edi movl %esi, %eax xor %edx, %edx movl $5, %ecx divl %ecx movl %edx, %edi // get modulo for 3, store in %ebp movl %esi, %eax xor %edx, %edx movl $3, %ecx divl %ecx movl %edx, %ebp // check if n mod 5 is 0 test $0xffffffff, %edi jnz notbuzz // print number push %esi call prnl pop %esi // start setting up write syscall movl $4, %eax movl $1, %ebx // check if n mod 3 is 0 test $0xffffffff, %ebp jnz notfizzbuzz // print "fizzbuzz" movl $fizzbuzz, %ecx movl $10, %edx int $0x80 jmp loop_continue notfizzbuzz: // print "buzz" movl $buzz, %ecx movl $6, %edx int $0x80 jmp loop_continue notbuzz: test $0xffffffff, %ebp jnz notfizz push %esi call prnl pop %esi // print "fizz" movl $4, %eax movl $1, %ebx movl $fizz, %ecx movl $6, %edx int $0x80 jmp loop_continue notfizz: // increment counter to next value loop_continue: inc %esi cmp $100, %esi jle loop // exit mov $1, %eax xor %ebx, %ebx int $0x80