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

этот вопрос уже есть ответ здесь:

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

section .data

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

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

4 ответов


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


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


документация 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


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

пример:

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

для 3-й строки $ относится к адресу самой строки, а $$ относится к адресу 1-й строки (где начался наш раздел). Эта конвенция работает для меня в NASM.

Источник:nasm.мы