butt ugly GAS syntax
.section .data
fizz: .ascii "fizz\n"
buzz: .ascii "buzz\n"
fizzbuzz: .ascii "fizzbuzz\n"
buf: .skip 20
nl: .ascii "\n"
.section .text
.global _start
_start:
mov $1, %r15
1:
/* mod 15 */
mov %r15, %rax
mov $15, %rbx
xor %rdx, %rdx
div %rbx
cmp $0, %rdx
jne 2f
mov $4, %rax
mov $1, %rbx
mov $9, %rdx
mov $fizzbuzz, %rcx
int $0x80
jmp 6f
2:
/* mod 3 */
mov %r15, %rax
mov $3, %rbx
xor %rdx, %rdx
div %rbx
cmp $0, %rdx
jne 3f
mov $4, %rax
mov $1, %rbx
mov $5, %rdx
mov $fizz, %rcx
int $0x80
jmp 6f
3:
/* mod 5 */
mov %r15, %rax
mov $5, %rbx
xor %rdx, %rdx
div %rbx
cmp $0, %rdx
jne 4f
mov $4, %rax
mov $1, %rbx
mov $5, %rdx
mov $buzz, %rcx
int $0x80
jmp 6f
4:
/* number to buffer */
mov %r15, %rax
mov $buf, %r14
add $20, %r14
5:
dec %r14
mov $10, %rbx
xor %rdx, %rdx
div %rbx
add $'0', %rdx
mov %dl, (%r14)
cmp $0, %rax
jne 5b
mov $4, %rax
mov $1, %rbx
mov $nl, %rdx
sub %r14, %rdx
inc %rdx
mov %r14, %rcx
int $0x80
6:
/* jump to 1 if counter != 101 */
inc %r15
cmp $101, %r15
jne 1b
/* exit */
mov $1, %rax
mov $0, %rbx
int $0x80
Save as fizzbuzz.S and compile with `as -o fizzbuzz.o fizzbuzz.S; ld -o fizzbuzz fizzbuzz.o`