$ 記号
CoddyのAssemblyジャーニー「基礎」セクションの一部 — レッスン 29/45。
write システムコール(第5章)を使用して文字列を出力するとき、何バイト出力するかをCPUに伝える必要があります。
手動で文字数を数えることもできます:
message db 'Hello', 0x0a ; 6バイト (H e l l o 改行)
mov rdx, 6 ; 手動カウントしかし、手動でのカウントは時間がかかり、ミスも起こりやすいです。文字列を変更した場合、再度カウントして数値を更新しなければなりません。
解決策:<strong>$lt;/strong>を使用した自動長さ計算
$はロケーションカウンタです。これは、次のバイトが配置される現在のメモリアドレスを表します。
例 1: シンプルな文字列
section .data
message db 'Hello', 0x0a
msgLen equ $ - message仕組み:
messageは開始アドレスです(例: 1000)- 6バイトを格納した後、
$は1006になります $ - message= 1006 − 1000 = 6(長さ)
注: equ は equate の略です。これは定数 — 値を表す名前を作成します。
例 2: 複数の文字列
section .data
first db 'Hi', 0x0a
len1 equ $ - first ; len1 = 3 ('H','i', 改行)
second db 'Hello', 0x0a
len2 equ $ - second ; len2 = 6 ('H','e','l','l','o', 改行)
各文字列には、自動的に計算される独自の長さがあります。$ は、常に各文字列の直後の現在の位置を参照するため、計算ごとにリセットされます。
チャレンジ
簡単値 'Paris' に続いて改行 (0x0a) を持つ、city という名前の文字列を作成してください。次に、$ - city を使用して長さを自動的に計算する cityLen という名前の定数を作成してください。
自分で試してみよう
%include "data.asm"
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, city
mov rdx, cityLen
syscall
mov rax, 60
mov rdi, 0
syscallこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。