ХАНДЫФАР

Функция ScanFormatFile считывает данные из файлового потока и сохраняет значения в соответствующих переменных.

Параметры:

  • AX: Указатель на строку с именем файла, завершающуюся нулём 0.
  • BX: Дескриптор файла, полученный после вызова функций CreateFile или OpenFile.
  • Остальные аргументы должны передаваться через стек используя любой из доступных регистров.

Предположим что файл test.txt содержит строку в которой все значения разделены пробелом: Евгений Довгополов М 36.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____fName____db "test.txt", 0
  6. ____fmtstr___db "%s %s %c %d"
  7. ____fmtout___db "ИМЯ: %.4s\nФАМИЛИЯ: "
  8. _____________db "%s\nПОЛ: %.4c\nВОЗРАСТ:"
  9. _____________db " %d\0"
  10. ____mName____db 20 dup(0)
  11. ____mSurname_db 20 dup(0)
  12. ____mSex_____db ?
  13. ____mAge_____dw ?
  14. ____fHandle__dw ?
  15. data ends
  16. code segment public
  17. ____assume _ds:data, cs:code
  18. ____include Handyfar.inc
  19. ____main proc
  20. ________call____SetDataSegment
  21. ________mov_____bl, READ_WRITE
  22. ________lea_____ax, ds:[fName]
  23. ________call____OpenFile
  24. ________mov_____fHandle, ax
  25. ________lea_____ax, ds:[mAge]
  26. ________push____ax
  27. ________lea_____ax, ds:[mSex]
  28. ________push____ax
  29. ________lea_____ax, ds:[mSurname]
  30. ________push____ax
  31. ________lea_____ax, ds:[mName]
  32. ________push____ax
  33. ________mov_____bx, fHandle
  34. ________lea_____ax, ds:[fmtstr]
  35. ________call____ScanFormatFile
  36. ________add_____sp, 8
  37. ________push____mAge
  38. ________mov_____al, mSex
  39. ________push____ax
  40. ________lea_____ax, ds:[mSurname]
  41. ________push____ax
  42. ________lea_____ax, ds:[mName]
  43. ________push____ax
  44. ________lea_____ax, ds:[fmtout]
  45. ________call____PrintFormatString
  46. ________add_____sp, 8
  47. ________xor_____al, al
  48. ________call____ExitProcess
  49. ____main endp
  50. code ends
  51. end main

В этом примере мы откроем файл в котором через пробел записаны два числа и считаем их в переменные aValue и bValue. Затем мы выполним сложение aValue и bValue а результат запишем в переменную rValue. После чего мы выведем результат в форматированной строке на консоль. В данном примере содержимое файла выглядит следующим образом: 5 8.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____fName___db "test.txt", 0
  6. ____fmtstr__db "%d %d"
  7. ____fmtout__db "%d + %d = %d\0"
  8. ____aValue__dw ?
  9. ____bValue__dw ?
  10. ____rValue__dw ?
  11. ____fHandle_dw ?
  12. data ends
  13. code segment public
  14. ____assume _ds:data, cs:code
  15. ____include Handyfar.inc
  16. ____main proc
  17. ________call____SetDataSegment
  18. ________mov_____bl, READ_WRITE
  19. ________lea_____ax, ds:[fName]
  20. ________call____OpenFile
  21. ________mov_____fHandle, ax
  22. ________lea_____ax, ds:[bValue]
  23. ________push____ax
  24. ________lea_____ax, ds:[aValue]
  25. ________push____ax
  26. ________mov_____bx, fHandle
  27. ________lea_____ax, ds:[fmtstr]
  28. ________call____ScanFormatFile
  29. ________add_____sp, 4
  30. ________mov_____ax, aValue
  31. ________add_____ax, bValue
  32. ________mov_____rValue, ax
  33. ________push____rValue
  34. ________push____bValue
  35. ________push____aValue
  36. ________lea_____ax, ds:[fmtout]
  37. ________call____PrintFormatString
  38. ________add_____sp, 6
  39. ________mov_____ax, fHandle
  40. ________call____CloseHandle
  41. ________xor_____al, al
  42. ________call____ExitProcess
  43. ____main endp
  44. code ends
  45. end main

В этом примере мы откроем файл в котором математическое выражение и считаем все числа в переменные aValue, bValue и cValue. Затем мы выполним вычисление. В данном примере содержимое файла выглядит следующим образом: 2 + (2 * 2).

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____fName___db "test.txt", 0
  6. ____fmtstr__db "%d + (%d * %d)"
  7. ____fmtout__db "%d + (%d * %d) = %d\0"
  8. ____aValue__dw ?
  9. ____bValue__dw ?
  10. ____cValue__dw ?
  11. ____rValue__dw ?
  12. ____fHandle_dw ?
  13. data ends
  14. code segment public
  15. ____assume _ds:data, cs:code
  16. ____include Handyfar.inc
  17. ____main proc
  18. ________call____SetDataSegment
  19. ________mov_____bl, READ_WRITE
  20. ________lea_____ax, ds:[fName]
  21. ________call____OpenFile
  22. ________mov_____fHandle, ax
  23. ________lea_____ax, ds:[cValue]
  24. ________push____ax
  25. ________lea_____ax, ds:[bValue]
  26. ________push____ax
  27. ________lea_____ax, ds:[aValue]
  28. ________push____ax
  29. ________mov_____bx, fHandle
  30. ________lea_____ax, ds:[fmtstr]
  31. ________call____ScanFormatFile
  32. ________add_____sp, 6
  33. ________mov_____ax, bValue_
  34. ________mov_____bx, cValue
  35. ________mul_____bx
  36. ________add_____ax, aValue
  37. ________mov_____rValue, ax
  38. ________push____rValue
  39. ________push____cValue
  40. ________push____bValue
  41. ________push____aValue
  42. ________lea_____ax, ds:[fmtout]
  43. ________call____PrintFormatString
  44. ________add_____sp, 8
  45. ________mov_____ax, fHandle
  46. ________call____CloseHandle
  47. ________xor_____al, al
  48. ________call____ExitProcess
  49. ____main endp
  50. code ends
  51. end main
Функция ScanFormatFile считывает данные из файлового потока и сохраняет значения в соответствующих переменных.

Параметры:

  • AX: Указатель на строку с именем файла, завершающуюся нулём 0.
  • BX: Дескриптор файла, полученный после вызова функций CreateFile или OpenFile.
  • Остальные аргументы должны передаваться через стек используя любой из доступных регистров.

Предположим что файл test.txt содержит строку в которой все значения разделены пробелом: Евгений Довгополов М 36.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____fName____db "test.txt", 0 ; Файл должен существовать в кодировке windows-1251
  6. ____fmtstr___db "%s %s %c %d"
  7. ____fmtout___db "ИМЯ: %.4s\nФАМИЛИЯ: %s\nПОЛ: %.4c\nВОЗРАСТ: %d\0"
  8. ____mName____db 20 dup(0)
  9. ____mSurname_db 20 dup(0)
  10. ____mSex_____db ?
  11. ____mAge_____dw ?
  12. ____fHandle__dw ?
  13. data ends
  14. code segment public _______________; Начало сегмента кода
  15. ____assume _ds:data, cs:code
  16. ____include Handyfar.inc___________; Подключаем файл с функциями
  17. ____main proc _____________________; Начало процедуры main
  18. ________call____SetDataSegment_____; Вызываем процедуру SetDataSegment
  19. ________mov_____bl, READ_WRITE_____; 2-й: Устанавливаем атрибут чтение и запись в регистр bl
  20. ________lea_____ax, ds:[fName]_____; 1-й: Загружаем адрес строки fName в регистр ds:ax
  21. ________call____OpenFile___________; Вызываем процедуру OpenFile(ax:fName, bl:READ_WRITE) := AX и CF
  22. ________mov_____fHandle, ax________; Сохраняем файловый дескриптор в переменной fHandle
  23. ________lea_____ax, ds:[mAge]______; Копируем значение переменной mAge в регистр ds:ax
  24. ________push____ax_________________; 6-й: Сохраняем значение регистра ax в стеке
  25. ________lea_____ax, ds:[mSex]______; Копируем значение переменной mSex в регистр ds:ax
  26. ________push____ax_________________; 5-й: Сохраняем значение регистра ax в стеке
  27. ________lea_____ax, ds:[mSurname]__; Загружаем адрес переменной mSurname в регистр ds:ax
  28. ________push____ax_________________; 4-й: Сохраняем значение регистра ax в стеке
  29. ________lea_____ax, ds:[mName]_____; Загружаем адрес переменной mName в регистр ds:ax
  30. ________push____ax_________________; 3-й: Сохраняем значение регистра ax в стеке
  31. ________mov_____bx, fHandle________; 2-й: Копируем значение файлового дескриптора fHandle в регистр bx
  32. ________lea_____ax, ds:[fmtstr]____; 1-й: Загружаем адрес строки fmtstr в регистр ds:ax
  33. ________call____ScanFormatFile_____; Вызываем процедуру ScanFormatFile(ax:fmtstr, ...)
  34. ________add_____sp, 8______________; Выравниваем стек
  35. ________push____mAge_______________; 5-й: Сохраняем значение переменной mAge в стеке
  36. ________mov_____al, mSex___________; Копируем значение переменной mSex в регистр al
  37. ________push____ax_________________; 4-й: Сохраняем значение регистра ax в стеке
  38. ________lea_____ax, ds:[mSurname]__; Загружаем адрес переменной mSurname в регистр ds:ax
  39. ________push____ax_________________; 3-й: Сохраняем значение регистра ax в стеке
  40. ________lea_____ax, ds:[mName]_____; Загружаем адрес переменной mName в регистр ds:ax
  41. ________push____ax_________________; 2-й: Сохраняем значение регистра ax в стеке
  42. ________lea_____ax, ds:[fmtout]____; 1-й: Загружаем адрес строки fmtout в регистр ds:ax
  43. ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:fmtout, ...)
  44. ________add_____sp, 8______________; Выравниваем стек
  45. ________xor_____al, al_____________; Обнуляем регистр al
  46. ________call____ExitProcess________; Вызываем процедуру ExitProcess
  47. ____main endp _____________________; Конец процедуры main
  48. code ends _________________________; Конец сегмента кода
  49. end main __________________________; Конец файла. Точкой входа указывается процедура main

В этом примере мы откроем файл в котором через пробел записаны два числа и считаем их в переменные aValue и bValue. Затем мы выполним сложение aValue и bValue а результат запишем в переменную rValue. После чего мы выведем результат в форматированной строке на консоль. В данном примере содержимое файла выглядит следующим образом: 5 8.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____fName___db "test.txt", 0
  6. ____fmtstr__db "%d %d"
  7. ____fmtout__db "%d + %d = %d\0"
  8. ____aValue__dw ?
  9. ____bValue__dw ?
  10. ____rValue__dw ?
  11. ____fHandle_dw ?
  12. data ends
  13. code segment public _______________; Начало сегмента кода
  14. ____assume _ds:data, cs:code
  15. ____include Handyfar.inc___________; Подключаем файл с функциями
  16. ____main proc _____________________; Начало процедуры main
  17. ________call____SetDataSegment_____; Вызываем процедуру SetDataSegment
  18. ________mov_____bl, READ_WRITE_____; 2-й: Устанавливаем атрибут чтение и запись в регистр bl
  19. ________lea_____ax, ds:[fName]_____; 1-й: Загружаем адрес строки fName в регистр ds:ax
  20. ________call____OpenFile___________; Вызываем процедуру OpenFile(ax:fName, bl:READ_WRITE) := AX и CF
  21. ________mov_____fHandle, ax________; Сохраняем файловый дескриптор в переменной fHandle
  22. ________lea_____ax, ds:[bValue]____; Загружаем адрес переменной bValue в регистр ds:ax
  23. ________push____ax_________________; 4-й: Сохраняем значение регистра ax в стеке
  24. ________lea_____ax, ds:[aValue]____; Загружаем адрес переменной aValue в регистр ds:ax
  25. ________push____ax_________________; 3-й: Сохраняем значение регистра ax в стеке
  26. ________mov_____bx, fHandle________; 2-й: Копируем значение файлового дескриптора fHandle в регистр bx
  27. ________lea_____ax, ds:[fmtstr]____; 1-й: Загружаем адрес строки fmtstr в регистр ds:ax
  28. ________call____ScanFormatFile_____; Вызываем процедуру ScanFormatFile(ax:fmtstr, aValue, bValue)
  29. ________add_____sp, 4______________; Выравниваем стек
  30. ________mov_____ax, aValue_________; Копируем значение переменной aValue в регистр ax
  31. ________add_____ax, bValue_________; Прибавляем к регистру ax значение в переменной bValue
  32. ________mov_____rValue, ax_________; Сохраняем значение регистра ax в переменной rValue
  33. ________push____rValue_____________; 4-й: Сохраняем значение переменной rValue в стеке
  34. ________push____bValue_____________; 3-й: Сохраняем значение переменной bValue в стеке
  35. ________push____aValue_____________; 2-й: Сохраняем значение переменной aValue в стеке
  36. ________lea_____ax, ds:[fmtout]____; 1-й: Загружаем адрес строки fmtout в регистр ds:ax
  37. ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:fmtout, ...)
  38. ________add_____sp, 6______________; Выравниваем стек
  39. ________mov_____ax, fHandle________; Копируем файловый дескриптор fHandle в регистр ax
  40. ________call____CloseHandle________; Вызываем процедуру CloseHandle(ax:fHandle)
  41. ________xor_____al, al_____________; Обнуляем регистр al
  42. ________call____ExitProcess________; Вызываем процедуру ExitProcess
  43. ____main endp _____________________; Конец процедуры main
  44. code ends _________________________; Конец сегмента кода
  45. end main __________________________; Конец файла. Точкой входа указывается процедура main

В этом примере мы откроем файл в котором математическое выражение и считаем все числа в переменные aValue, bValue и cValue. Затем мы выполним вычисление. В данном примере содержимое файла выглядит следующим образом: 2 + (2 * 2).

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____fName___db "test.txt", 0
  6. ____fmtstr__db "%d + (%d * %d)"
  7. ____fmtout__db "%d + (%d * %d) = %d\0"
  8. ____aValue__dw ?
  9. ____bValue__dw ?
  10. ____cValue__dw ?
  11. ____rValue__dw ?
  12. ____fHandle_dw ?
  13. data ends
  14. code segment public _______________; Начало сегмента кода
  15. ____assume _ds:data, cs:code
  16. ____include Handyfar.inc___________; Подключаем файл с функциями
  17. ____main proc _____________________; Начало процедуры main
  18. ________call____SetDataSegment_____; Вызываем процедуру SetDataSegment
  19. ________mov_____bl, READ_WRITE_____; 2-й: Устанавливаем атрибут чтение и запись в регистр bl
  20. ________lea_____ax, ds:[fName]_____; 1-й: Загружаем адрес строки fName в регистр ds:ax
  21. ________call____OpenFile___________; Вызываем процедуру OpenFile(ax:fName, bl:READ_WRITE) := AX и CF
  22. ________mov_____fHandle, ax________; Сохраняем файловый дескриптор в переменной fHandle
  23. ________lea_____ax, ds:[cValue]____; Загружаем адрес переменной cValue в регистр ds:ax
  24. ________push____ax_________________; 5-й: Сохраняем значение регистра ax в стеке
  25. ________lea_____ax, ds:[bValue]____; Загружаем адрес переменной bValue в регистр ds:ax
  26. ________push____ax_________________; 4-й: Сохраняем значение регистра ax в стеке
  27. ________lea_____ax, ds:[aValue]____; Загружаем адрес переменной aValue в регистр ds:ax
  28. ________push____ax_________________; 3-й: Сохраняем значение регистра ax в стеке
  29. ________mov_____bx, fHandle________; 2-й: Копируем значение файлового дескриптора fHandle в регистр bx
  30. ________lea_____ax, ds:[fmtstr]____; 1-й: Загружаем адрес строки fmtstr в регистр ds:ax
  31. ________call____ScanFormatFile_____; Вызываем процедуру ScanFormatFile(ax:fmtstr, ...)
  32. ________add_____sp, 6______________; Выравниваем стек
  33. ________mov_____ax, bValue_________; Копируем значение переменной bValue в регистр ax
  34. ________mov_____bx, cValue_________; Копируем значение переменной cValue в регистр bx
  35. ________mul_____bx_________________; Выполняем умножение значения в регистре ax на значение в bx
  36. ________add_____ax, aValue_________; Прибавляем к регистру ax значение в переменной aValue
  37. ________mov_____rValue, ax_________; Сохраняем значение регистра ax в переменной rValue
  38. ________push____rValue_____________; 5-й: Сохраняем значение переменной rValue в стеке
  39. ________push____cValue_____________; 4-й: Сохраняем значение переменной cValue в стеке
  40. ________push____bValue_____________; 3-й: Сохраняем значение переменной bValue в стеке
  41. ________push____aValue_____________; 2-й: Сохраняем значение переменной aValue в стеке
  42. ________lea_____ax, ds:[fmtout]____; 1-й: Загружаем адрес строки fmtout в регистр ds:ax
  43. ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:fmtout, ...)
  44. ________add_____sp, 8______________; Выравниваем стек
  45. ________mov_____ax, fHandle________; Копируем файловый дескриптор fHandle в регистр ax
  46. ________call____CloseHandle________; Вызываем процедуру CloseHandle(ax:fHandle)
  47. ________xor_____al, al_____________; Обнуляем регистр al
  48. ________call____ExitProcess________; Вызываем процедуру ExitProcess
  49. ____main endp _____________________; Конец процедуры main
  50. code ends _________________________; Конец сегмента кода
  51. end main __________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda