ХАНДЫФАР

Функция 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 для вывода строки.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____fmtstr db "Привет, Мир 8086 Ассемблера!\0"
  6. data ends
  7. code segment public _______________; Начало сегмента кода
  8. ____assume _ds:data, cs:code
  9. ____include Handyfar.inc___________; Подключаем файл с функциями
  10. ____main proc _____________________; Начало процедуры main
  11. ________call____SetDataSegment_____; Вызываем процедуру SetDataSegment
  12. ________lea_____ax, ds:[fmtstr]____; Загружаем адрес переменной fmtstr в регистр ds:ax
  13. ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:fmtstr)
  14. ________xor_____al, al_____________; Обнуляем регистр al
  15. ________call____ExitProcess________; Вызываем процедуру ExitProcess
  16. ____main endp _____________________; Конец процедуры main
  17. code ends _________________________; Конец сегмента кода
  18. end main __________________________; Конец файла. Точкой входа указывается процедура main

Пример использования функции PrintFormatString для вывода форматированной строки в которой присутствует спецификатор %c, который выводит один символ.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____fmtstr db "Символ: %c\0"
  6. data ends
  7. code segment public _______________; Начало сегмента кода
  8. ____assume _ds:data, cs:code
  9. ____include Handyfar.inc___________; Подключаем файл с функциями
  10. ____main proc _____________________; Начало процедуры main
  11. ________call____SetDataSegment_____; Вызываем процедуру SetDataSegment
  12. ________mov_____al, 'Д'____________; Копируем значение символа 'Д' в регистр al
  13. ________push____ax_________________; 2-й: Сохраняем значение регистра ax в стеке
  14. ________lea_____ax, ds:[fmtstr]____; 1-й: Загружаем адрес строки формата fmtstr в регистр ds:ax
  15. ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:fmtstr, 'Д')
  16. ________add_____sp, 2______________; Выравниваем стек
  17. ________xor_____al, al_____________; Обнуляем регистр al
  18. ________call____ExitProcess________; Вызываем процедуру ExitProcess
  19. ____main endp _____________________; Конец процедуры main
  20. code ends _________________________; Конец сегмента кода
  21. end main __________________________; Конец файла. Точкой входа указывается процедура main

Пример использования функции PrintFormatString для вывода форматированной строки в которой присутствуют спецификаторы %s и %c.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____fmtstr db "Меня зовут %s и первая буква моей фамилии '%c'.\0"
  6. ____mName _db "Евгений\0"
  7. data ends
  8. code segment public _______________; Начало сегмента кода
  9. ____assume _ds:data, cs:code
  10. ____include Handyfar.inc___________; Подключаем файл с функциями
  11. ____main proc _____________________; Начало процедуры main
  12. ________call____SetDataSegment_____; Вызываем процедуру SetDataSegment
  13. ________mov_____al, 'Д'____________; Копируем значение символа 'Д' в регистр al
  14. ________push____ax_________________; 3-й: Сохраняем значение регистра ax в стеке
  15. ________lea_____ax, ds:[mName]_____; Загружаем адрес строки формата mName в регистр ds:ax
  16. ________push____ax_________________; 2-й: Сохраняем значение регистра ax в стеке
  17. ________lea_____ax, ds:[fmtstr]____; 1-й: Загружаем адрес строки формата fmtstr в регистр ds:ax
  18. ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:fmtstr, 'Евгений', 'Д')
  19. ________add_____sp, 4______________; Выравниваем стек
  20. ________xor_____al, al_____________; Обнуляем регистр al
  21. ________call____ExitProcess________; Вызываем процедуру ExitProcess
  22. ____main endp _____________________; Конец процедуры main
  23. code ends _________________________; Конец сегмента кода
  24. end main __________________________; Конец файла. Точкой входа указывается процедура main

Пример использования функции PrintFormatString для вывода форматированной строки в которой присутствует спецификатор %d. Вы так же можете использовать спецификатор %d16.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____fmtstr db "Я изучаю Ассемблер %d архитектуры.\0"
  6. data ends
  7. code segment public _______________; Начало сегмента кода
  8. ____assume _ds:data, cs:code
  9. ____include Handyfar.inc___________; Подключаем файл с функциями
  10. ____main proc _____________________; Начало процедуры main
  11. ________call____SetDataSegment_____; Вызываем процедуру SetDataSegment
  12. ________mov_____ax, 8086___________; Копируем значение 8086 в регистр ax
  13. ________push____ax_________________; 2-й: Сохраняем значение регистра ax в стеке
  14. ________lea_____ax, ds:[fmtstr]____; 1-й: Загружаем адрес строки формата fmtstr в регистр ds:ax
  15. ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:fmtstr, 8086)
  16. ________add_____sp, 2______________; Выравниваем стек
  17. ________xor_____al, al_____________; Обнуляем регистр al
  18. ________call____ExitProcess________; Вызываем процедуру ExitProcess
  19. ____main endp _____________________; Конец процедуры main
  20. code ends _________________________; Конец сегмента кода
  21. end main __________________________; Конец файла. Точкой входа указывается процедура main

Пример использования функции PrintFormatString для вывода форматированной строки в которой присутствует спецификатор %i16 для вывода 16-разрядного числа и %i32 для вывода 32-разрядного числа. Вы так же можете использовать спецификатор %d32.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____fmtstr db "16-битное десятичное число: %i16\n"
  6. ___________db "32-битное десятичное число: %i32\0"
  7. ____dec16b dw 28123
  8. ____dec32b dd 536870912
  9. data ends
  10. code segment public ____________________; Начало сегмента кода
  11. ____assume _ds:data, cs:code
  12. ____include Handyfar.inc________________; Подключаем файл с функциями
  13. ____main proc __________________________; Начало процедуры main
  14. ________call____SetDataSegment__________; Вызываем процедуру SetDataSegment
  15. ________mov_____ax, word ptr[dec32b+2]__; Копируем вторую половину числа dec32b в регистр ax
  16. ________push____ax______________________; 4-й: Сохраняем значение регистра ax в стеке
  17. ________mov_____ax, word ptr[dec32b]____; Копируем первую половину числа dec32b в регистр ax
  18. ________push____ax______________________; 3-й: Сохраняем значение регистра ax в стеке
  19. ________push____dec16b__________________; 2-й: Сохраняем значение переменной dec16b в стеке
  20. ________lea_____ax, ds:[fmtstr]_________; 1-й: Загружаем адрес строки формата fmtstr в регистр ds:ax
  21. ________call____PrintFormatString_______; Вызываем процедуру PrintFormatString(ax:fmtstr, ...)
  22. ________add_____sp, 6___________________; Выравниваем стек
  23. ________xor_____al, al__________________; Обнуляем регистр al
  24. ________call____ExitProcess_____________; Вызываем процедуру ExitProcess
  25. ____main endp __________________________; Конец процедуры main
  26. code ends ______________________________; Конец сегмента кода
  27. end main _______________________________; Конец файла. Точкой входа указывается процедура main

Пример использования функции PrintFormatString для вывода форматированной строки в которой присутствуют спецификатор %a который выводит адрес переменной в шестнадцатеричном формате.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____fmtstr _db "Адрес 'string2': %a\0"
  6. ____string1 db "Евгений\0"
  7. ____string2 db "Довгополов\0"
  8. data ends
  9. code segment public ____________________; Начало сегмента кода
  10. ____assume _ds:data, cs:code
  11. ____include Handyfar.inc________________; Подключаем файл с функциями
  12. ____main proc __________________________; Начало процедуры main
  13. ________call____SetDataSegment__________; Вызываем процедуру SetDataSegment
  14. ________lea_____ax, ds:[string2]________; Загружаем адрес строки формата string2 в регистр ds:ax
  15. ________push____ax______________________; 2-й: Сохраняем значение регистра ax в стеке
  16. ________lea_____ax, ds:[fmtstr]_________; 1-й: Загружаем адрес строки формата fmtstr в регистр ds:ax
  17. ________call____PrintFormatString_______; Вызываем процедуру PrintFormatString(ax:fmtstr, 'Довгополов')
  18. ________add_____sp, 2___________________; Выравниваем стек
  19. ________xor_____al, al__________________; Обнуляем регистр al
  20. ________call____ExitProcess_____________; Вызываем процедуру ExitProcess
  21. ____main endp __________________________; Конец процедуры main
  22. code ends ______________________________; Конец сегмента кода
  23. end main _______________________________; Конец файла. Точкой входа указывается процедура main

Пример использования функции PrintFormatString для вывода форматированной строки в которой присутствуют спецификаторы %d, %h, %o, %b и %f.

Made on
Tilda