Menu
Coddy logo textTech

Byte Count (rdx)

CoddyのAssemblyジャーニー「基礎」セクションの一部。レッスン 38/45。

OS にどこへ出力するか(rdi)と、何を出力するか(rsi)を伝えました。次に、印字するバイト数を伝える必要があります。

バイト数を指定するレジスタは rdx です。

OS にはなぜ長さが必要なのでしょうか?

OS は文字列がどこで終わるのかを知りません。長さがなければ、メモリを永遠に読み続けることになります。長さによって、いつ停止すればよいのかを OS に正確に伝えます。

例:

section .data
    msg db 'Hello', 0x0a
    msgLen equ $ - msg

section .text
    mov rdx, msgLen      ; rdx = 出力するバイト数

length が間違っているとどうなりますか?

設定した値結果
短すぎるstring の一部だけが出力される
長すぎるOS は string の先にある不正なメモリまで読み続けるため、ランダムな文字が出力されたり、クラッシュしたりする可能性があります
Zero何も出力されない

長さを自動的に計算する:

第3章ですでに $ - label パターンを学びました。

section .data
    msg db 'Hello', 0x0a
    msgLen equ $ - msg    ; msgLen = 6 (Hello + 改行)

これにより、文字列を変更しても長さは常に正しくなります。

完全な例:

section .data
    msg db 'Hello', 0x0a
    msgLen equ $ - msg

section .text
    mov rax, 1           ; write システムコール
    mov rdi, 1           ; 標準出力
    mov rsi, msg         ; 文字列のアドレス
    mov rdx, msgLen      ; バイト数
    syscall
challenge icon

チャレンジ

colorという名前の文字列が与えられ、その値は改行に続く'Red'です。colorLenという定数は、$ - colorを使用してすでに定義されています。

colorLen定数を使用して、rdxを文字列の長さに設定するコード行を書いてください。

rdx用のmov命令だけを書いてください。

自分で試してみよう

section .text
    global _start

_start:
    ; 学生のコードが最初に実行される(rdx を設定する)
    %include "solution.asm"
    
    mov rax, 1
    mov rdi, 1
    mov rsi, color
    ; rdx にはすでに長さが入っている(学生のコードから)
    syscall

    mov rax, 60
    mov rdi, 0
    syscall
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン

自分で練習してみよう: Assemblyプレイグラウンド