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 на терминальном входе (например), символ новой строки будет блокировать его, пока вы не введете непустую строку после числа ...