Значение intfmt: db "% d", 10, 0 в сборке - PullRequest
3 голосов
/ 12 декабря 2011

Недавно я увидел это в верхней части одного из моих файлов сборки и понял, что потратил целую вечность, используя его в процессе печати целых чисел, фактически не понимая, откуда оно изначально (использовалось в моем базовом шаблоне сборки) или что, 0 в конце означает:

section .data
    intfmt: db "%d", 10, 0

Может ли кто-нибудь разбить это и объяснить различные компоненты, в частности, строку 2?

Я сейчас пытаюсь прочитать ввод с помощью scanf, и кажется,этот формат не работает правильно для этого.Подумайте, пришло время узнать, что означают числа!

Кроме того, если у вас есть какие-либо идеи по чтению при вводе данных на 64-битной архитектуре с использованием scanf, я раньше этого не делал, и это вызывает у меня некоторые проблемы, поэтому любыеуказатели на это также приветствуется!

1 Ответ

5 голосов
/ 12 декабря 2011

intfmt: - это метка - это может быть любая строка, но другой код ссылается на нее.

db - псевдоинструкция «определения байтов». Вместо того чтобы собирать инструкцию машинного кода, она сбрасывает необработанные байты в поток кода (в данном случае это раздел .data).

"%d", 10, 0 - байты для сброса в поток. Первая строка ascii, которая выводит два байта (символы «%» и «d»), 10 - символ новой строки (\n в C), а 0 - нулевой байт.

Обратите внимание, что строка является необработанной строкой - НЕ заканчивается nul и НЕ поддерживает экранирование в стиле C (например, \n для новой строки). В общем, это создает нечто эквивалентное строке C "% d \ n" с символом новой строки и символом NUL.

Теперь о том, почему это работает для printf, а не для scanf (и почему это переключается, если вы удалите 10), связано с тем, как работают printf и scanf, и что означает перевод строки для каждого из них.

В printf, новая строка печатает новую строку, а затем (если вывод находится в режиме буферизации строки, что, вероятно, и есть), очищает внутренний буфер вывода, чтобы вы могли увидеть результат. Поэтому, когда вы удаляете 10, нет никакого сброса, и вы не видите результат.

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

...