ХАНДЫФАР

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

Параметры:

  • AX: Указатель на данные, которые необходимо записать в файл.
  • BX:_Дескриптор файла, полученный после вызова функций CreateFile или OpenFile.

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

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

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

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

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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____fName____db "test.txt", 0
  6. ____fBuffer__db "Здравствуйте, я изучаю "
  7. _____________db "язык ассемблера!\0"
  8. ____wSuccess db "Данные были успешно "
  9. _____________db "записаны в файл!\0"
  10. ____wError___db "Произошла ошибка при "
  11. _____________db "записи в файл '%s'. "
  12. _____________db "Код ошибки: %d\0"
  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_____bx, ax
  23. ________lea_____ax, ds:[fBuffer]
  24. ________call____WriteFile
  25. ________jnc_____NoWriteFileError
  26. ________push____ax
  27. ________lea_____ax, ds:[fName]
  28. ________push____ax
  29. ________lea_____ax, ds:[wError]
  30. ________call____PrintFormatString
  31. ________add_____sp, 4
  32. ________jmp_____Done
  33. ____NoWriteFileError:
  34. ________lea_____ax, ds:[wSuccess]
  35. ________call____WriteString
  36. ____Done:
  37. ________xor_____al, al
  38. ________call____ExitProcess
  39. ____main endp
  40. code ends
  41. end main
Функция WriteFile записывает данные в файл, используя дескриптор файла.

Параметры:

  • AX: Указатель на данные, которые необходимо записать в файл.
  • BX:_Дескриптор файла, полученный после вызова функций CreateFile или OpenFile.

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

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

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

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

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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____fName____db "test.txt", 0
  6. ____fBuffer__db "Здравствуйте, я изучаю язык ассемблера!\0"
  7. ____wSuccess db "Данные были успешно записаны в файл!\0"
  8. ____wError___db "Произошла ошибка при записи в файл '%s'. Код ошибки: %d\0"
  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_____bl, READ_WRITE_____; 2-й: Устанавливаем атрибут чтение и запись в регистр bl
  16. ________lea_____ax, ds:[fName]_____; 1-й: Загружаем адрес строки fName в регистр ds:ax
  17. ________call____OpenFile___________; Вызываем процедуру OpenFile(ds:ax, READ_WRITE) := AX и CF
  18. ________mov_____bx, ax_____________; 2-й: Копируем файловый дескриптор(ax) в регистр bx
  19. ________lea_____ax, ds:[fBuffer]___; 1-й: Загружаем адрес буфера fBuffer в регистр ds:ax
  20. ________call____WriteFile__________; Вызываем процедуру WriteFile(ax:fBuffer, bx)
  21. ________jnc_____NoWriteFileError___; Если CF=0, то прыгаем на метку NoWriteFileError
  22. ________push____ax_________________; 3-й: Сохраняем значение регистра ax(код ошибки) в стеке
  23. ________lea_____ax, ds:[fName]_____; Загружаем адрес переменной fName в регистр ds:ax
  24. ________push____ax_________________; 2-й: Сохраняем значение регистра ax в стеке
  25. ________lea_____ax, ds:[wError]____; 1-й: Загружаем адрес строки формата wError в регистр ds:ax
  26. ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:wError, fName, ax)
  27. ________add_____sp, 4______________; Выравниваем стек
  28. ________jmp_____Done_______________; Выполняем безусловный переход на метку Done
  29. ____NoWriteFileError:
  30. ________lea_____ax, ds:[wSuccess]__; Загружаем адрес буфера wSuccess в регистр ds:ax
  31. ________call____WriteString________; Вызываем процедуру WriteString(ax:wSuccess)
  32. ____Done:
  33. ________xor_____al, al_____________; Обнуляем регистр al
  34. ________call____ExitProcess________; Вызываем процедуру ExitProcess
  35. ____main endp _____________________; Конец процедуры main
  36. code ends _________________________; Конец сегмента кода
  37. end main __________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda