;gemini 3.0生成 section .bss buffer resb 64 ; 入力用のバッファ section .text global _start _start: ; --- 1. 標準入力から読み込み (sys_read) --- mov rax, 0 ; syscall number for sys_read mov rdi, 0 ; file descriptor 0 (stdin) mov rsi, buffer ; buffer address mov rdx, 64 ; max bytes to read syscall ; --- 2. 文字列解析 (String to Integer) --- ; bufferに入っている "10 100" を解析する mov rsi, buffer ; ポインタをバッファの先頭に xor rax, rax ; 数値の累積用 (A用) xor rbx, rbx ; 作業用レジスタ parse_a: mov bl, [rsi] ; 1文字読み込み inc rsi cmp bl, ' ' ; スペースならAの読み込み終了 je save_a sub bl, '0' ; ASCII -> 数値変換 imul rax, 10 ; 桁上がり add rax, rbx ; 加算 jmp parse_a save_a: mov r8, rax ; Aの値を r8 に保存 xor rax, rax ; Bのために rax をクリア parse_b: mov bl, [rsi] ; 1文字読み込み inc rsi cmp bl, 10 ; 改行コード(\n)なら終了 je calc_steps cmp bl, 0 ; NULL終端なら終了 je calc_steps cmp bl, '0' ; 数字以外(ゴミデータ)チェック jl calc_steps cmp bl, '9' jg calc_steps sub bl, '0' imul rax, 10 add rax, rbx jmp parse_b ; --- 3. 計算処理 --- ; 現在: rax = b, r8 = a ; 計算: steps = b / a (余りがあれば +1) calc_steps: xor rdx, rdx ; div命令の前にrdxを0クリア (rdx:rax / r8) div r8 ; rax = 商, rdx = 余り cmp rdx, 0 ; 余りが0かチェック je to_string ; 余り0ならそのまま inc rax ; 余りがあれば1歩追加 ; --- 4. 数値を文字列に変換 (Integer to String) --- to_string: mov rsi, buffer ; バッファを再利用 add rsi, 63 ; バッファの末尾へ移動 mov byte [rsi], 10 ; 改行コードをセット mov rbx, 10 ; 除数 10 convert_loop: dec rsi ; ポインタを前に戻す xor rdx, rdx ; 余りクリア div rbx ; rax / 10 add dl, '0' ; 余りをASCIIコードに変換 mov [rsi], dl ; バッファに格納 test rax, rax ; 商が0になったか? jnz convert_loop ; 0でなければループ ; --- 5. 結果を出力 (sys_write) --- ; rsi は現在、文字列の先頭を指している ; 長さを計算: (buffer + 64) - rsi mov rdx, buffer add rdx, 64 sub rdx, rsi ; 長さを rdx にセット mov rax, 1 ; syscall number for sys_write mov rdi, 1 ; file descriptor 1 (stdout) syscall ; rsiはすでにセットされている ; --- 6. 終了 (sys_exit) --- mov rax, 60 ; syscall number for sys_exit xor rdi, rdi ; status 0 syscall