$ 記号
CoddyのAssemblyジャーニー「基礎」セクションの一部。レッスン 29/45。
writeシステムコール(第5章)を使用して文字列を出力する場合、出力するバイト数をCPUに伝える必要があります。
文字数を手作業で数えることもできます:
message db 'Hello', 0x0a ; 6バイト (H e l l o 改行)
mov rdx, 6 ; 手動カウントしかし、手作業で数えるのは遅く、間違いが起こりやすい方法です。文字列を変更した場合は、もう一度数えて数値を更新しなければなりません。
解決策:$を使用した自動的な長さの計算
$はロケーションカウンタです。次のバイトが配置される現在のメモリアドレスを表します。
例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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Assemblyプレイグラウンド