Функция
PrintFormatString принимает строку формата и необязательные аргументы и выдаёт форматированную последовательность символов для вывода. Строка формата может содержать ноль или более директив, которые являются либо литеральными символами для вывода, либо спецификациями кодированного преобразования, описывающими, как форматировать аргумент в выходных данных.
Каждое поле спецификации преобразования представляет собой символ или цифру, обозначающую определённый параметр формата или спецификатор преобразования. Обязательное "поле типа" определяет тип преобразования, которое будет применено к аргументу. Необязательное поле "ширина" управляет другим аспектом формата, таким как начальные пробелы и выравнивание.
Символ спецификатора преобразования типа указывает, следует ли интерпретировать соответствующий аргумент как символ, строку, указатель или целое число. Символ типа является единственным обязательным полем спецификации преобразования, и он появляется после любых необязательных полей.
Аргументы, которые следуют за строкой формата, интерпретируются в соответствии с соответствующим символом типа. Преобразования для типов символов задаются с помощью
%c, а однобайтовые строки задаются с помощью
%s.
Десятичное число со знаком и без знака задаётся с помощью
%d/
%i, %d16/
%i16 (
%d/
%i по умолчанию выводит 16-разрядное число) и
%d32/
%i32 (выводит 32-разрядное число), восьмеричное число задаётся с помощью
%o, двоичное число задаётся с помощью
%b, шестнадцатеричное число задаётся с помощью
%h.
Вещественное число со знаком и без задаётся с помощью
%f. Функция выводит только 2 числа после точки. Выравнивание стека не требуется. Чтобы указать количество чисел после точки, воспользуйтесь функцией
SetPrecision и укажите в регистре
al число выводимих цифр после точки.
С помощью спецификатора
%a, можно получить адрес расположения аргумента в сегменте данных.
Ширина поля по левому краю задаётся с помощью
%. за которым следует число и символ типа.
Например:
"Hello %.4s!"По умолчанию ширина заполняется пробелами. Если необходимо указать другой символ то, следует использовать следующую последовательность символов:
%.#(?
), где # это ширина, а ? это символ для заполнения.
Например:
"Hello %.4(-)s!"Спецификатор
%* указывает функции
PrintFormatString на то, что аргумент передаваемый функции должен быть проигнорирован для вывода на консоль. Символы пробела следующие за
%* тоже игнорируются.
Функция
PrintFormatString поддерживает управляющие последовательности, такие как
\t - Горизонтальная табуляция, выравниванивает по горизонтальной сетке, которая равна 8 символам,
\b - backspace,
\r - возврат каретки,
\n - переход на новую строку,
\0 - символ завершения строки.
Первым аргументом функции
PrintFormatString должен быть указатель на строку формата в регистре
ax, все остальные аргументы должны передаваться через стек используя любой из доступных регистров.
Вещественные числа загружаются на вершину стека математического сопроцессора с помощью инструкции
FLD (Загрузить вещественное число).
Функцию
PrintFormatString можно использовать вместо функции
WriteString для вывода строки.
- title Автор: Довгополов Евгений Сергеевич
- .model small
- .stack 100h
- data segment public
- ____fmtstr db "Привет, Мир 8086 Ассемблера!\0"
- data ends
- code segment public _______________; Начало сегмента кода
- ____assume _ds:data, cs:code
- ____include Handyfar.inc___________; Подключаем файл с функциями
- ____main proc _____________________; Начало процедуры main
- ________call____SetDataSegment_____; Вызываем процедуру SetDataSegment
- ________lea_____ax, ds:[fmtstr]____; Загружаем адрес переменной fmtstr в регистр ds:ax
- ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:fmtstr)
- ________xor_____al, al_____________; Обнуляем регистр al
- ________call____ExitProcess________; Вызываем процедуру ExitProcess
- ____main endp _____________________; Конец процедуры main
- code ends _________________________; Конец сегмента кода
- end main __________________________; Конец файла. Точкой входа указывается процедура main
Пример использования функции
PrintFormatString для вывода форматированной строки в которой присутствует спецификатор
%c, который выводит один символ.
- title Автор: Довгополов Евгений Сергеевич
- .model small
- .stack 100h
- data segment public
- ____fmtstr db "Символ: %c\0"
- data ends
- code segment public _______________; Начало сегмента кода
- ____assume _ds:data, cs:code
- ____include Handyfar.inc___________; Подключаем файл с функциями
- ____main proc _____________________; Начало процедуры main
- ________call____SetDataSegment_____; Вызываем процедуру SetDataSegment
- ________mov_____al, 'Д'____________; Копируем значение символа 'Д' в регистр al
- ________push____ax_________________; 2-й: Сохраняем значение регистра ax в стеке
- ________lea_____ax, ds:[fmtstr]____; 1-й: Загружаем адрес строки формата fmtstr в регистр ds:ax
- ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:fmtstr, 'Д')
- ________add_____sp, 2______________; Выравниваем стек
- ________xor_____al, al_____________; Обнуляем регистр al
- ________call____ExitProcess________; Вызываем процедуру ExitProcess
- ____main endp _____________________; Конец процедуры main
- code ends _________________________; Конец сегмента кода
- end main __________________________; Конец файла. Точкой входа указывается процедура main
Пример использования функции
PrintFormatString для вывода форматированной строки в которой присутствуют спецификаторы
%s и
%c.
- title Автор: Довгополов Евгений Сергеевич
- .model small
- .stack 100h
- data segment public
- ____fmtstr db "Меня зовут %s и первая буква моей фамилии '%c'.\0"
- ____mName _db "Евгений\0"
- data ends
- code segment public _______________; Начало сегмента кода
- ____assume _ds:data, cs:code
- ____include Handyfar.inc___________; Подключаем файл с функциями
- ____main proc _____________________; Начало процедуры main
- ________call____SetDataSegment_____; Вызываем процедуру SetDataSegment
- ________mov_____al, 'Д'____________; Копируем значение символа 'Д' в регистр al
- ________push____ax_________________; 3-й: Сохраняем значение регистра ax в стеке
- ________lea_____ax, ds:[mName]_____; Загружаем адрес строки формата mName в регистр ds:ax
- ________push____ax_________________; 2-й: Сохраняем значение регистра ax в стеке
- ________lea_____ax, ds:[fmtstr]____; 1-й: Загружаем адрес строки формата fmtstr в регистр ds:ax
- ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:fmtstr, 'Евгений', 'Д')
- ________add_____sp, 4______________; Выравниваем стек
- ________xor_____al, al_____________; Обнуляем регистр al
- ________call____ExitProcess________; Вызываем процедуру ExitProcess
- ____main endp _____________________; Конец процедуры main
- code ends _________________________; Конец сегмента кода
- end main __________________________; Конец файла. Точкой входа указывается процедура main
Пример использования функции
PrintFormatString для вывода форматированной строки в которой присутствует спецификатор
%d. Вы так же можете использовать спецификатор
%d16.
- title Автор: Довгополов Евгений Сергеевич
- .model small
- .stack 100h
- data segment public
- ____fmtstr db "Я изучаю Ассемблер %d архитектуры.\0"
- data ends
- code segment public _______________; Начало сегмента кода
- ____assume _ds:data, cs:code
- ____include Handyfar.inc___________; Подключаем файл с функциями
- ____main proc _____________________; Начало процедуры main
- ________call____SetDataSegment_____; Вызываем процедуру SetDataSegment
- ________mov_____ax, 8086___________; Копируем значение 8086 в регистр ax
- ________push____ax_________________; 2-й: Сохраняем значение регистра ax в стеке
- ________lea_____ax, ds:[fmtstr]____; 1-й: Загружаем адрес строки формата fmtstr в регистр ds:ax
- ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:fmtstr, 8086)
- ________add_____sp, 2______________; Выравниваем стек
- ________xor_____al, al_____________; Обнуляем регистр al
- ________call____ExitProcess________; Вызываем процедуру ExitProcess
- ____main endp _____________________; Конец процедуры main
- code ends _________________________; Конец сегмента кода
- end main __________________________; Конец файла. Точкой входа указывается процедура main
Пример использования функции
PrintFormatString для вывода форматированной строки в которой присутствует спецификатор
%i16 для вывода 16-разрядного числа и
%i32 для вывода 32-разрядного числа. Вы так же можете использовать спецификатор
%d32.
- title Автор: Довгополов Евгений Сергеевич
- .model small
- .stack 100h
- data segment public
- ____fmtstr db "16-битное десятичное число: %i16\n"
- ___________db "32-битное десятичное число: %i32\0"
- ____dec16b dw 28123
- ____dec32b dd 536870912
- data ends
- code segment public ____________________; Начало сегмента кода
- ____assume _ds:data, cs:code
- ____include Handyfar.inc________________; Подключаем файл с функциями
- ____main proc __________________________; Начало процедуры main
- ________call____SetDataSegment__________; Вызываем процедуру SetDataSegment
- ________mov_____ax, word ptr[dec32b+2]__; Копируем вторую половину числа dec32b в регистр ax
- ________push____ax______________________; 4-й: Сохраняем значение регистра ax в стеке
- ________mov_____ax, word ptr[dec32b]____; Копируем первую половину числа dec32b в регистр ax
- ________push____ax______________________; 3-й: Сохраняем значение регистра ax в стеке
- ________push____dec16b__________________; 2-й: Сохраняем значение переменной dec16b в стеке
- ________lea_____ax, ds:[fmtstr]_________; 1-й: Загружаем адрес строки формата fmtstr в регистр ds:ax
- ________call____PrintFormatString_______; Вызываем процедуру PrintFormatString(ax:fmtstr, ...)
- ________add_____sp, 6___________________; Выравниваем стек
- ________xor_____al, al__________________; Обнуляем регистр al
- ________call____ExitProcess_____________; Вызываем процедуру ExitProcess
- ____main endp __________________________; Конец процедуры main
- code ends ______________________________; Конец сегмента кода
- end main _______________________________; Конец файла. Точкой входа указывается процедура main
Пример использования функции
PrintFormatString для вывода форматированной строки в которой присутствуют спецификатор
%a который выводит адрес переменной в шестнадцатеричном формате.
- title Автор: Довгополов Евгений Сергеевич
- .model small
- .stack 100h
- data segment public
- ____fmtstr _db "Адрес 'string2': %a\0"
- ____string1 db "Евгений\0"
- ____string2 db "Довгополов\0"
- data ends
- code segment public ____________________; Начало сегмента кода
- ____assume _ds:data, cs:code
- ____include Handyfar.inc________________; Подключаем файл с функциями
- ____main proc __________________________; Начало процедуры main
- ________call____SetDataSegment__________; Вызываем процедуру SetDataSegment
- ________lea_____ax, ds:[string2]________; Загружаем адрес строки формата string2 в регистр ds:ax
- ________push____ax______________________; 2-й: Сохраняем значение регистра ax в стеке
- ________lea_____ax, ds:[fmtstr]_________; 1-й: Загружаем адрес строки формата fmtstr в регистр ds:ax
- ________call____PrintFormatString_______; Вызываем процедуру PrintFormatString(ax:fmtstr, 'Довгополов')
- ________add_____sp, 2___________________; Выравниваем стек
- ________xor_____al, al__________________; Обнуляем регистр al
- ________call____ExitProcess_____________; Вызываем процедуру ExitProcess
- ____main endp __________________________; Конец процедуры main
- code ends ______________________________; Конец сегмента кода
- end main _______________________________; Конец файла. Точкой входа указывается процедура main
Пример использования функции
PrintFormatString для вывода форматированной строки в которой присутствуют спецификаторы
%d,
%h,
%o,
%b и
%f.