Функция
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
- ________call____SetDataSegment
- ________lea_____ax, ds:[fmtstr]
- ________call____PrintFormatString
- ________xor_____al, al
- ________call____ExitProcess
- ____main endp
- code ends
- end 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
- ________call____SetDataSegment
- ________mov_____al, 'Д'
- ________push____ax
- ________lea_____ax, ds:[fmtstr]
- ________call____PrintFormatString
- ________add_____sp, 2
- ________xor_____al, al
- ________call____ExitProcess
- ____main endp
- code ends
- end 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
- ________call____SetDataSegment
- ________mov_____al, 'Д'
- ________push____ax
- ________lea_____ax, ds:[mName]
- ________push____ax
- ________lea_____ax, ds:[fmtstr]
- ________call____PrintFormatString
- ________add_____sp, 4
- ________xor_____al, al
- ________call____ExitProcess
- ____main endp
- code ends
- end 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
- ________call____SetDataSegment
- ________mov_____ax, 8086
- ________push____ax
- ________lea_____ax, ds:[fmtstr]
- ________call____PrintFormatString
- ________add_____sp, 2
- ________xor_____al, al
- ________call____ExitProcess
- ____main endp
- code ends
- end 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
- ________call____SetDataSegment
- ________mov_____ax, word ptr[dec32b+2]
- ________push____ax
- ________mov_____ax, word ptr[dec32b]
- ________push____ax
- ________push____dec16b
- ________lea_____ax, ds:[fmtstr]
- ________call____PrintFormatString
- ________add_____sp, 6
- ________xor_____al, al
- ________call____ExitProcess
- ____main endp
- code ends
- end 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
- ________call____SetDataSegment
- ________lea_____ax, ds:[string2]
- ________push____ax
- ________lea_____ax, ds:[fmtstr]
- ________call____PrintFormatString
- ________add_____sp, 2
- ________xor_____al, al
- ________call____ExitProcess
- ____main endp
- code endsend main
Пример использования функции
PrintFormatString для вывода форматированной строки в которой присутствуют спецификаторы
%d,
%h,
%o,
%b и
%f.
- title Автор: Довгополов Евгений Сергеевич
- .model small
- .stack 100h
- data segment public
- ____fmtstr db "DEC: %d\nHEX: %h\nOCT: ______________%o\nBIN: %b\nFPU: %f\n\0"
- ____double dq 123.45
- data ends
- code segment public
- ____assume _ds:data, cs:code
- ____include Handyfar.inc
- ____main proc
- ________call____SetDataSegment
- ________fld_____qword ptr[double]
- ________add_____ax, 1234
- ________push____ax
- ________push____ax
- ________push____ax
- ________push____ax
- ________lea_____ax, ds:[fmtstr]
- ________call____PrintFormatString
- ________add_____sp, 8
- ________xor_____al, al
- ________call____ExitProcess
- ____main endp
- code ends
- end main
Пример использования функции
PrintFormatString для вывода форматированной строки в которой присутствуют спецификаторы
%* и
%s.
- title Автор: Довгополов Евгений Сергеевич
- .model small
- .stack 100h
- data segment public
- ____fmtstr __db "Меня зовут %* %s.\0"
- ____mName ___db "Евгений\0"
- ____mSurname db "Довгополов\0"
- data ends
- code segment public
- ____assume _ds:data, cs:code
- ____include Handyfar.inc
- ____main proc
- ________call____SetDataSegment
- ________lea_____ax, ds:[mName]
- ________push____ax
- ________lea_____ax, ds:[mSurname]
- ________push____ax
- ________lea_____ax, ds:[fmtstr]
- ________call____PrintFormatString
- ________add_____sp, 4
- ________xor_____al, al
- ________call____ExitProcess
- ____main endp
- code ends
- end main