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チャレンジ
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Assemblyプレイグラウンド