Я очень жду отзывов и рекомендаций, а не прямого ответа.
Используя инструкции ассемблера .586
, как вы можете имитировать printf-подобные функции? Для полей фиксированной ширины я знаю, что могу сделать что-то вроде этого:
.data
Format BYTE 'You are ## years old.',0
А затем перед печатью строки просто замените значения ## на соответствующее число, затем измените их обратно на случай, если мне понадобится несколько раз использовать строку формата с разными значениями.
Возможно, это не лучший способ, но пока он работает.
Чего я не могу понять, так это как сделать это, если вы заранее не знаете количество цифр. Опция формата подходит, если вы знаете максимальное количество цифр, которое вы хотите использовать (приведенный выше пример не будет работать так же, как для людей старше 100 лет, вы теряете пробелы между словами).
Если вы зарезервируете слишком много места, вы получите двойные пробелы между вашим числом и вашими мирами.
.data
Format BYTE 'You are ### years old.',0
Использование моей схемы с кем-то, кому 12, даст:
You are 12 years old.
Моя единственная мысль была о том, что там был персонаж ASCII, который ничего не печатал (кроме \0
), но он кажется липким.
Вся проблема возникает потому, что инструктор хочет, чтобы мы могли печатать форматированную строку этого типа, используя один вызов процедуры PrintString (которую он нам предоставил), которая ищет для esi
значение \0
завершенный байтовый массив.