ХАНДЫФАР

Функция ReadFileEx считывает данные из файла. Функция ReadFileEx автоматически выравнивает стек на 6 байт.

Параметры:

  1. Указатель на буфер, завершающиюся нулём 0, в который будут записаны считанные данные.
  2. Дескриптор файла, полученный после вызова функций CreateFile/Ex или OpenFile/Ex.
  3. Количество байт для считывания.

Возвращаемое значение:

  • Если CF = 0: AX содержит количество успешно считанных байт.
  • Если CF = 1: AX содержит код ошибки.

Состояние флагов:

  • Функция влияет на все флаги.

Особенности:

  • Функция считывает данные из файла, используя указанный дескриптор файла.
  • Функция не изменяет значения регистров, кроме AX и флагов.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .286C
  3. .model small
  4. .stack 100h
  5. data segment public
  6. ____strout _db "Введите имя файла: \0"
  7. ____fName __db 13 dup(0)
  8. ____fBuffer db 255 dup(0)
  9. ____oError _db "Произошла ошибка при "
  10. ____________db "открытии '%s'. Код "
  11. ____________db "ошибки: %d\0"
  12. ____rError__db "Произошла ошибка при "
  13. ____________db "чтении из '%s'. Код "
  14. ____________db "ошибки: %d\0"
  15. data ends
  16. code segment public
  17. ____assume _ds:data, cs:code
  18. ____include Handyfar.inc
  19. ____include Handymac.inc
  20. ____main proc
  21. ________call____SetDataSegment
  22. ________pushs___ds:[strout]
  23. ________call____WriteStringEx
  24. ________pushs___ds:[fName]
  25. ________call____ReadStringEx
  26. ________push____READ_WRITE
  27. ________pushs___ds:[fName]
  28. ________call____OpenFileEx
  29. ________jnc ____@NoOpenFileError
  30. ________push____ax
  31. ________pushs___ds:[fName]
  32. ________leaax___ds:[oError]
  33. ________call____PrintFormatString
  34. ________add_____sp, 4
  35. ________jmp_____@Done
  36. ____@NoOpenFileError:
  37. ________push____0FFh
  38. ________push____ax
  39. ________pushs___ds:[fBuffer]
  40. ________call____ReadFileEx
  41. ________jnc_____@NoReadFileError
  42. ________push____ax
  43. ________pushs___ds:[fName]
  44. ________leaax___ds:[rError]
  45. ________call____PrintFormatString
  46. ________add_____sp, 4
  47. ________jmp_____@Done
  48. ____@NoReadFileError:
  49. ________pushs___ds:[fBuffer]
  50. ________call____WriteStringEx
  51. ____@Done:
  52. ________push____0
  53. ________call____ExitProcessEx
  54. ____main endp
  55. code ends
  56. end main
Функция ReadFileEx считывает данные из файла. Функция ReadFileEx автоматически выравнивает стек на 6 байт.

Параметры:

  1. Указатель на буфер, завершающиюся нулём 0, в который будут записаны считанные данные.
  2. Дескриптор файла, полученный после вызова функций CreateFile/Ex или OpenFile/Ex.
  3. Количество байт для считывания.

Возвращаемое значение:

  • Если CF = 0: AX содержит количество успешно считанных байт.
  • Если CF = 1: AX содержит код ошибки.

Состояние флагов:

  • Функция влияет на все флаги.

Особенности:

  • Функция считывает данные из файла, используя указанный дескриптор файла.
  • Функция не изменяет значения регистров, кроме AX и флагов.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .286C
  3. .model small
  4. .stack 100h
  5. data segment public
  6. ____strout _db "Введите имя файла: \0"
  7. ____fName __db 13 dup(0)
  8. ____fBuffer db 255 dup(0)
  9. ____oError _db "Произошла ошибка при открытии '%s'. Код ошибки: %d\0"
  10. ____rError__db "Произошла ошибка при чтении из '%s'. Код ошибки: %d\0"
  11. data ends
  12. code segment public
  13. ____assume _ds:data, cs:code
  14. ____include Handyfar.inc___________; Подключаем файл с функциями
  15. ____include Handymac.inc___________; Подключаем файл с макросами
  16. ____main proc
  17. ________call____SetDataSegment_____; Вызываем процедуру SetDataSegment
  18. ________pushs___ds:[strout]________; Ложим на вершину стека адрес переменной strout
  19. ________call____WriteStringEx______; Вызываем процедуру WriteStringEx(strout)
  20. ________pushs___ds:[fName]_________; Ложим на вершину стека адрес переменной fName
  21. ________call____ReadStringEx_______; Вызываем процедуру ReadStringEx(fName)
  22. ________push____READ_WRITE_________; 2-й: Ложим на вершину стека атрибут READ_WRITE
  23. ________pushs___ds:[fName]_________; 1-й: Ложим на вершину стека адрес переменной fName
  24. ________call____OpenFileEx_________; Вызываем процедуру OpenFileEx(fName, READ_WRITE) := AX и CF
  25. ________jnc ____@NoOpenFileError___; Если CF=0, то прыгаем на метку @NoOpenFileError
  26. ________push____ax_________________; 3-й: Ложим на вершину стека ax (код ошибки)
  27. ________pushs___ds:[fName]_________; 2-й: Ложим на вершину стека адрес переменной fName
  28. ________leaax___ds:[oError]________; 1-й: Загружаем адрес строки формата oError в регистр ds:ax
  29. ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:oError, fName, ax)
  30. ________add_____sp, 4______________; Выравниваем стек
  31. ________jmp_____@Done______________; Выполняем безусловный переход на метку @Done
  32. ____@NoOpenFileError:
  33. ________push____0FFh_______________; 3-й: Ложим на вершину стека число байт для считывания
  34. ________push____ax_________________; 2-й: Ложим на вершину стека файловый дескриптор
  35. ________pushs___ds:[fBuffer]_______; 1-й: Ложим на вершину стека адрес переменной fName
  36. ________call____ReadFileEx_________; Вызываем процедуру ReadFileEx(fBuffer, fHandle, 255) := AX и CF
  37. ________jnc_____@NoReadFileError___; Если CF=0, то прыгаем на метку @NoReadFileError
  38. ________push____ax_________________; 3-й: Ложим на вершину стека ax (код ошибки)
  39. ________pushs___ds:[fName]_________; 2-й: Ложим на вершину стека адрес переменной fName
  40. ________leaax___ds:[rError]________; 1-й: Загружаем адрес строки формата rError в регистр ds:ax
  41. ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:rError, fName, ax)
  42. ________add_____sp, 4______________; Выравниваем стек
  43. ________jmp_____@Done______________; Выполняем безусловный переход на метку @Done
  44. ____@NoReadFileError:
  45. ________pushs___ds:[fBuffer]_______; Ложим на вершину стека адрес переменной fBuffer
  46. ________call____WriteStringEx______; Вызываем процедуру WriteStringEx(fBuffer)
  47. ____@Done:
  48. ________push____0__________________; Ложим на вершину стека байтовое значение кода возврата
  49. ________call____ExitProcessEx______; Вызываем процедуру ExitProcess(0)
  50. ____main endp
  51. code ends
  52. end main
Made on
Tilda