Menu
Coddy logo textTech

$ 記号

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(長さ)

注: equequateの略です。値を表す名前である定数を作成します。

例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', 改行)

各文字列には、独自の長さが自動的に計算されます。$ は各計算のたびにリセットされます。これは常に各文字列の直後にある現在の位置を指すためです。

challenge icon

チャレンジ

簡単

値が '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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン

自分で練習してみよう: Assemblyプレイグラウンド