x86版FizzBuzz

FizzBuzz 6日目です。本来、私が最初の日(3日目)に予定していたのが、これです。けっこうやる気だったんですよ^_^;
ideone.com では、Assembler 32bit (nasm 2.12.01) を使っています。

global _start
 
section .data
fizz	db 'Fizz'
buzz	db 'Buzz'
number	db '   '
linefeed db 0x0a

section .text
 
_start:
	mov	ebp, 1
	mov	esi, 3
	mov	edi, 5
iter:
	push	ebp
	xor	ebp, ebp
	dec	esi
	jnz	skip1
	mov	ecx, fizz ; address
	mov     edx, 4	; length
	mov     ebx, 1	; stdout
	mov     eax, 4	; sys_write
	int     0x80
	mov	esi, 3
	inc	ebp
skip1:
	dec	edi
	jnz	skip2
	mov	ecx, buzz ; address
	mov     edx, 4	; length
	mov     ebx, 1	; stdout
	mov     eax, 4	; sys_write
	int     0x80
	mov	edi, 5
	inc	ebp
skip2:
	or	ebp, ebp
	pop	ebp
	jnz	skip3
	mov	ecx, number ; address
	mov	ax, bp
	cmp	al, 100
	sbb	al, al
	add	al, '1'
	mov	[number], al
	cmp	al, '1'
	adc	ecx, 0
	mov	ax, bp
	mov	dl, 10
	div	dl
	mov	bl, ah
	mov	ah, 0
	div	dl
	mov	al, ah
	add	al, '0'
	mov	[number+1], al
	cmp	al, '1'
	adc	ecx, 0
	mov	al, bl
	add	al, '0'
	mov	[number+2], al
	mov	edx, number + 3
	sub	edx, ecx
	mov     ebx, 1	; stdout
	mov     eax, 4	; sys_write
	int     0x80
skip3:
	mov	ecx, linefeed ; address
	mov     edx, 1	; length
	mov     ebx, 1	; stdout
	mov     eax, 4	; sys_write
	int     0x80
	inc	ebp
	cmp	ebp, 100
	jbe	iter
exit:
	mov	eax, 01h		; exit()
	xor	ebx, ebx		; errno
	int	80h

※参考→ ideone.com

10進のところは迷って使ってしまいましたが、3の倍数/5の倍数では除算を使っていないのがミソです。16bit/32bit混在な感じですが、大目に見てください。どちらかというと、Z80版も試してみたかったのですが、オンライン環境でよさげなところが見当たらず……(あるのかもしれませんが、とにかく忙しくなってしまったので)。MASM もあるので .COM プログラムでも作ってみようかと思ったのですが、勝手を忘れてしまいました^_^;