ХАНДЫФАР

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

Параметры:

  1. Указатель на строку с именем файла, завершающуюся 0.
  2. Указатель на данные, которые необходимо записать в файл.

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

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

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

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

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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .286C
  3. .model small
  4. .stack 100h
  5. data segment public
  6. ____fName____db "test.txt", 0
  7. ____fBuffer _db "Здравствуйте, я изучаю "
  8. _____________db "язык ассемблера!\0"
  9. ____wSuccess db "Данные были успешно "
  10. _____________db "записаны в файл!\0"
  11. ____wError___db "Произошла ошибка при _____________db "записи в '%s'. Код "
  12. _____________db "ошибки: %d\0"
  13. data ends
  14. code segment public
  15. ____assume _ds:data, cs:code
  16. ____include Handyfar.inc
  17. ____include Handymac.inc
  18. ____main proc
  19. ________call____SetDataSegment
  20. ________pushs___ds:[fBuffer]
  21. ________pushs___ds:[fName]
  22. ________call____WriteFileExD
  23. ________jnc_____@NoWriteFileError
  24. ________push____ax
  25. ________pushs___ds:[fName]
  26. ________leaax___ds:[wError]
  27. ________call____PrintFormatString
  28. ________add_____sp, 4
  29. ________jmp_____@Done
  30. ____@NoWriteFileError:
  31. ________pushs___ds:[wSuccess]
  32. ________call____WriteStringEx
  33. ____@Done:
  34. ________push____0
  35. ________call____ExitProcessEx
  36. ____main endp
  37. code ends
  38. end main
Функция WriteFileExD самостоятельно открывает и записывает данные в файл. Функция WriteFileExD автоматически выравнивает стек на 4 байта.

Параметры:

  1. Указатель на строку с именем файла, завершающуюся 0.
  2. Указатель на данные, которые необходимо записать в файл.

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

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

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

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

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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .286C
  3. .model small
  4. .stack 100h
  5. data segment public
  6. ____fName____db "test.txt", 0
  7. ____fBuffer _db "Здравствуйте, я изучаю язык ассемблера!\0"
  8. ____wSuccess db "Данные были успешно записаны в файл!\0"
  9. ____wError___db "Произошла ошибка при записи в '%s'. Код ошибки: %d\0"
  10. data ends
  11. code segment public
  12. ____assume _ds:data, cs:code
  13. ____include Handyfar.inc___________; Подключаем файл с функциями
  14. ____include Handymac.inc___________; Подключаем файл с макросами
  15. ____main proc
  16. ________call____SetDataSegment_____; Вызываем процедуру SetDataSegment
  17. ________pushs___ds:[fBuffer]_______; 2-й: Ложим на вершину стека адрес переменной fBuffer
  18. ________pushs___ds:[fName]_________; 1-й: Ложим на вершину стека адрес переменной fName
  19. ________call____WriteFileExD_______; Вызываем процедуру WriteFileExD(fName, fBuffer) := AX и CF
  20. ________jnc_____@NoWriteFileError__; Если CF=0, то прыгаем на метку @NoWriteFileError
  21. ________push____ax_________________; 3-й: Ложим на вершину стека ax (код ошибки)
  22. ________pushs___ds:[fName]_________; 2-й: Ложим на вершину стека адрес переменной fName
  23. ________leaax___ds:[wError]________; 1-й: Загружаем адрес строки формата wError в регистр ds:ax
  24. ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:wError, fName, ax)
  25. ________add_____sp, 4______________; Выравниваем стек
  26. ________jmp_____@Done______________; Выполняем безусловный переход на метку @Done
  27. ____@NoWriteFileError:
  28. ________pushs___ds:[wSuccess]______; Ложим на вершину стека адрес переменной wSuccess
  29. ________call____WriteStringEx______; Вызываем процедуру WriteStringEx(wSuccess)
  30. ____@Done:
  31. ________push____0__________________; Ложим на вершину стека байтовое значение кода возврата
  32. ________call____ExitProcessEx______; Вызываем процедуру ExitProcess(0)
  33. ____main endp
  34. code ends
  35. end main
Made on
Tilda