はてなキーワード: 8086とは
http://anond.hatelabo.jp/20070508170219 こいつをアセンブラで書こうとしていたが、
すでに
http://anond.hatelabo.jp/20070510170511 にそれっぽいものが書かれていた。
しかしデクリメントした直後に判定するならフラグですむがそうじゃないときはtest命令入れないといけないのでうまくいかんと思った。
とりあえず8086アセンブラで書いてみたが長くなったので実行ファイル(fizzbuzz.com)をBase64で下に書いておくよ。
~) ls -al fizzbuzz.com -a--rwx 98 May 11 03:28 fizzbuzz.com* ~) base64 < fizzbuzz.com uwUDuQoJvl0B/s91ErcD/st1BrpSAesOkLpLAesWkP7LdQi6VgGzBesKkLg6OivBiQSL1rQJzSH+ zXXNtQr+yXXHulYBzSG0TM0hRml6eg0KJEZpenpCdXp6DQokVU0NCiQ=
数字の表示の処理で10で割った余りを使っていたのでまずいと思って修正した。ついでに98バイトまで縮めてみた。
こんなことに時間を使っている俺はバカだ。
ソースも載せとこう。8086なんてほとんど初めてに等しいので汚いだろうけど。
CODE SEGMENT ASSUME CS:CODE,DS:CODE ORG 100H START: mov bx, 0305h mov cx, 090Ah mov si, OFFSET NUM LOOP: dec bh jnz skip1 ; 3の倍数だった mov bh, 3 dec bl jnz skip2 ; 3の倍数で5の倍数だった mov dx, OFFSET FIZZBUZZ jmp loop5 skip2: ; 3の倍数で5の倍数じゃなかった mov dx, OFFSET FIZZ jmp loopend skip1: ; 3の倍数じゃないとき dec bl jnz skip3 ; 3の倍数じゃなくて5の倍数だった mov dx, OFFSET BUZZ loop5: mov bl, 5 jmp loopend skip3: ; 3の倍数じゃなくて5の倍数でもなかった ; 数字を表示する。2桁でいい mov ax, 3A3Ah sub ax, cx mov [si],ax mov dx, si loopend: mov ah,9 int 21h dec ch jne loop mov ch,10 dec cl jne loop ; 最後のBuzzを表示する mov dx, OFFSET BUZZ int 21h mov ax, 4c00H int 21h FIZZ: DB 'Fizz', 0dh, 0ah, '$' FIZZBUZZ: DB 'Fizz' BUZZ: DB 'Buzz', 0dh, 0ah, '$' NUM: DB 'UM', 0dh, 0ah, '$' CODE ENDS END START