$ 記号
CoddyのAssemblyジャーニー「基礎」セクションの一部。レッスン 29/45。
write syscall(第5章)を使用して文字列を出力するときは、何バイトを出力するのかをCPUに伝える必要があります。
文字を手作業で数えることもできます。
message db 'Hello', 0x0a ; 6バイト (H e l l o 改行)
mov rdx, 6 ; 手動カウントしかし、手動で数えるのは遅く、間違いが起こりやすくなります。文字列を変更した場合は、もう一度数え直して数値を更新しなければなりません。
解決策:<strong>$</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 を使用して長さを自動的にcalculatesする、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プレイグラウンド