Das $-Symbol
Teil des Abschnitts Grundlagen der Assembly-Journey von Coddy — Lektion 29 von 45.
Wenn Sie einen String mit dem write-Systemaufruf (Kapitel 5) ausgeben, müssen Sie der CPU mitteilen, wie viele Bytes gedruckt werden sollen.
Sie könnten die Zeichen manuell zählen:
message db 'Hello', 0x0a ; 6 Bytes (H e l l o Zeilenumbruch)
mov rdx, 6 ; Manuelle ZählungAber manuelles Zählen ist langsam und fehleranfällig. Wenn Sie den String ändern, müssen Sie neu zählen und die Zahl aktualisieren.
Die Lösung: automatische Längenberechnung mit <strong>$lt;/strong>
$ ist der Positionszähler — er repräsentiert die aktuelle Speicheradresse, an der das nächste Byte platziert wird.
Beispiel 1: Einfacher String
section .data
message db 'Hello', 0x0a
msgLen equ $ - messageWie es funktioniert:
messageist die Startadresse (Beispiel: 1000)- Nach dem Speichern von 6 Bytes wird
$zu 1006 $ - message= 1006 − 1000 = 6 (die Länge)
Hinweis: equ steht für equate. Es erstellt eine Konstante — einen Namen, der einen Wert darstellt.
Beispiel 2: Mehrere Strings
section .data
first db 'Hi', 0x0a
len1 equ $ - first ; len1 = 3 ('H','i', Zeilenumbruch)
second db 'Hello', 0x0a
len2 equ $ - second ; len2 = 6 ('H','e','l','l','o', Zeilenumbruch)
Jeder String hat seine eigene Länge, die automatisch berechnet wird. Das $ wird für jede Berechnung zurückgesetzt, da es sich immer auf die aktuelle Position direkt nach jedem String bezieht.
Aufgabe
EinfachErstellen Sie einen String namens city mit dem Wert 'Paris' gefolgt von einem Zeilenumbruch (0x0a). Erstellen Sie dann eine Konstante namens cityLen, die automatisch die Länge unter Verwendung von $ - city berechnet.
Probier es selbst
%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
syscallDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen
1Die Maschine
Was ist eine CPUSpeicherRegister vs. SpeicherWie Befehle funktionierenZwei-Dateien-MusterDie x86-64 Architektur