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 = 出力するバイト数

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

設定値結果
短すぎる文字列の一部のみが出力されます
長すぎるOSは文字列を超えてガベージメモリまで読み取りを続けます。ランダムな文字が出力されたり、クラッシュしたりする可能性があります。
ゼロ何も出力されません

長さの自動計算:

第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' で、その後に改行が続きます。$ - color を使用して、colorLen という名前の定数がすでに定義されています。

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

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腕試し

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

基礎のすべてのレッスン