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チャレンジ
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。