Сборка NASM - что означает ", 0" после этой переменной? - PullRequest
0 голосов
/ 28 июня 2018

Непосредственно перед тем, как я следовал руководству по использованию функции MessageBoxA в сборке, и при создании переменных они использовали «, 0» после содержимого переменной. Для чего это?

Код выглядит так:

paramText  db  "this is text", 0

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Функция MessageBoxA ожидает завершенную нулем строку байтов . Ноль - это просто нулевой терминатор , который сообщает всем функциям C, принимающим строку, где заканчивается строка.

0 голосов
/ 28 июня 2018

db это "определить байт", и этот код будет производить эти байты (в шестнадцатеричном формате):

74 68 69 73 20 69 73 20 74 65 78 74 00

«Строка» в кавычках разделена на коды символов ASCII (я полагаю, что UTF8 в NASM тоже возможен, поэтому один символ может выдавать несколько байтов) для отдельных символов, а последнее значение «0» просто компилируется как что, как ноль.

т.е. db 1, 2, 3 даст 3 байта машинного кода 01 02 03.

Ноль ставится после последней буквы как «string nul terminator» для использования другим кодом, который принимает строки, оканчивающиеся на ноль (например, MessageBoxA code).

«Переменная» является концепцией достаточно высокого уровня в программировании, и машина не поддерживает ее напрямую, во время компиляции вы получаете «символ / символическое имя» paramText, что соответствует адресу памяти первого Байт, определенный после него (0x74) =, может использоваться во время компиляции для работы с этим адресом. Затем db создает фактический двоичный машинный код =, который будет существовать во время выполнения в качестве значений, загружаемых в память ОС. И последний ноль является частью «переменного содержимого» в этом контексте (а не «после него»), если вы хотите так думать об этом.

Но это просто двоичные значения в памяти компьютера. «Переменная» логика (включая тип и / или форматирование) создается кодом, который манипулирует памятью, и языком программирования + компилятором, позволяющим такие конструкции в исходном коде, но сам ЦП не знает об этой концепции и работает только с битами (обычно сгруппированными в байты, слова, ...).


РЕДАКТИРОВАТЬ: на самом деле вы можете использовать C-подобные строковые экранированные значения и в NASM, но строка должна быть заключена в обратные галочки, например:

paramText:  db  `this is text\0`

Кавычки и апострофы не сканируют строковый литерал на предмет escape-последовательности, и компилируют «\ 0» в виде двух символов. Но использование «, 0» в качестве определения следующего байта легче запомнить, чем запомнить разницу между заданными строками обратного кавычка / кавычки, которая является специфической для NASM функцией и поддерживается не всеми сборщиками x86.

0 голосов
/ 28 июня 2018

Это буквально нулевой байт, скорее всего, с целью создания строки с нулевым символом в конце .

...