Что означает знак доллара ($) в сборке x86 при вычислении длин строк, таких как "$ - label"?

Например, если бы мы писали простую программу hello world type, раздел.data может содержать что-то вроде:

section .data

msg     db      'Enter something: '
len     equ     $ - msg

Что представляет собой $ в этом примере, и почему $ - msg равно длине строки?

Ответ 1

Это означает адрес "здесь". Здесь "здесь" находится байт после окончания строки msg. Это будет описано в любой документации ассемблера. Прочтите документацию.

Ответ 2

В этом случае значение $ означает текущий адрес в соответствии с ассемблером. $ - msg - текущий адрес ассемблера минус адрес msg, который будет длиной строки.

Ответ 3

Документация NASM

http://www.nasm.us/doc/nasmdoc3.html#section-3.5

NASM поддерживает два специальных токена в выражениях, позволяя вычислениям включать текущую позицию сборки: токены $ и $$. $ оценивает позицию сборки в начале строки, содержащей выражение; поэтому вы можете закодировать бесконечный цикл, используя JMP $.

http://www.nasm.us/doc/nasmdoc3.html#section-3.2.4

EQU определяет символ для заданного постоянного значения: при использовании EQU строка источника должна содержать метку. Действие EQU состоит в том, чтобы определить данное имя метки для значения его (только) операнда. Это определение является абсолютным и не может измениться позже. Так, например,

message         db      'hello, world' 
msglen          equ     $-message

определяет msglen как константу 12

Ответ 4

$ используется для обозначения текущего адреса, а $$ используется для обозначения адреса начала текущего раздела в сборке.

пример:

section .text
  Mov A,0x0000
  Mov B,0x0000
  Mov C,0x0000

для третьей строки $ ссылается на адрес самой строки, а $$ - на адрес первой строки (где начинается наш раздел). Эта конвенция работает для меня в nasm.

Источник: nasm.us