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 プログラムでも作ってみようかと思ったのですが、勝手を忘れてしまいました^_^;