結果
| 問題 | No.46 はじめのn歩 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-01-08 12:11:39 |
| 言語 | Assembler (nasm 3.01) |
| 結果 |
AC
|
| 実行時間 | 1 ms / 5,000 ms |
| コード長 | 3,057 bytes |
| 記録 | |
| コンパイル時間 | 412 ms |
| コンパイル使用メモリ | 8,104 KB |
| 実行使用メモリ | 7,848 KB |
| 最終ジャッジ日時 | 2026-01-08 12:11:40 |
| 合計ジャッジ時間 | 1,262 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 10 |
ソースコード
;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