Что означает знак доллара ( $ ) в сборке x86 при расчете длины строки, например "$ - label"? [дубликат]
этот вопрос уже есть ответ здесь:
- как именно работает $ в NASM? 1 ответ
например ,если бы мы писали простую программу типа 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.мы