Глупый вопрос про ADDR cWritten

Тема в разделе "WASM.BEGINNERS", создана пользователем aptyp, 27 июн 2009.

  1. aptyp

    aptyp Member

    Публикаций:
    0
    Регистрация:
    17 сен 2008
    Сообщения:
    81
    ;Как известно для того чтобы вывести строку на экран существует вызов процедуры
    invoke WriteConsoleA, ; она для выполнения вывода использует параметры
    stdout, ; дескриптор стандартного устройства вывода драйвера монитора
    ADDR msg, ; вычисленный при компиляции адрес начала выводимого сообщения на экран
    sizeof msg, ; вычисленное при компиляции число байтов в сообщении выводимом на экран
    ADDR cWritten, ; адрес где хранится число выводимых байтов сообщения выводимого на экран
    NULL ; просто бесполезное число ноль

    Объясните по возможности подробнее в чём необходимость эти двух?
    Код (Text):
    1. ADDR cWritten,
    2. 0
     
  2. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    aptyp
    Ну вас что, в msdn'е забанили? :)
    Последнее - зарезервено, может когда-то что-то и означало, но теперь нет.
    А предпоследнее - количество символов, которые удалось вывести. Ну, мало ли, что бывает :) При нормальной работе после выполнения должно быть nNumberOfCharsToWrite == *lpNumberOfCharsWritten.
     
  3. aptyp

    aptyp Member

    Публикаций:
    0
    Регистрация:
    17 сен 2008
    Сообщения:
    81
    Ustus
    сейчас только пробил через yandex что такое есть этот msdn (LOL)

    В общет получается что сохранение и числа выведеных символов на экран орсуществялется навсякий случай, как и передача его процедуре? А можно ли осуществлять вывод без ного вообще (это глупый вопрос номер два)?

    удивительно но кто-то тоже задавал подобный вопрос http://rfpro.ru/question/29404
     
  4. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    aptyp
    Завидую.... :):):)

    Ну не совсем... дело в том, что каждая операция ввода-вывода как бы может и не выполнится надлежащим образом. И иногда принципиально знать, до какого места она все-таки выполнилась. Так что это вопрос контроля/надежности.

    Судя по описанию - нет, то есть надо передавать осмысленный адрес. Но пользоваться тем что оно туда напишет вроде как никто и не заставляет.
     
  5. aptyp

    aptyp Member

    Публикаций:
    0
    Регистрация:
    17 сен 2008
    Сообщения:
    81
    Всё, наконец понял смысл параметра ADDR cWritten,
    этим параметром определяется( или устанавливается ) адрес для последующего сохранения туда числа выведенных символов которые были выведены на экран. А я долго ломал голову думая что число там уже изначально после компиляции существует. ))

    А по этому поводу на самом деле запутал меня вот этот код:
    start:
    invoke StrDisp, ADDR msg,sizeof msg
    invoke ExitProcess, 0
    StrDisp proc StrAddr:lol: WORD, StrSz:lol: WORD

    ;push ebp
    ;mov ebp,esp

    sub esp,8
    invoke GetStdHandle, STD_OUTPUT_HANDLE
    mov [ebp-4], eax
    invoke WriteConsoleA,[ebp-4],[ebp+8],[ebp+12],ADDR [ebp-8],NULL

    ;mov esp, ebp
    ;pop ebp

    ret 8
    StrDisp endp
    end start
     
  6. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    aptyp
    можно не заморачиваться с использованием WriteConsole
    вы и имеете ввиду без WriteConsole?
    Ну, используйте WriteFile.
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    aptyp
    Если как написал Ustus не обрабатывать возможные ошибки то можно и так
    Код (Text):
    1. ; masm windows console #
    2. .686P
    3. .model flat  ;32 bit memory model
    4.  
    5. include windows.inc
    6. includelib kernel32.lib
    7. extern _imp__GetStdHandle@4:dword
    8. extern _imp__WriteConsoleA@20:dword
    9. .code
    10. start:  xchg ebx,eax; в WinXP при старте приложения eax=0
    11. ;Get Console Output
    12.     push STD_OUTPUT_HANDLE
    13.     call _imp__GetStdHandle@4
    14.     push ebx; зарезервировано
    15.     push esp; сюда вернут количество записанных в Console Output символов
    16.         push messagesize; размер буфера
    17.     call @f; указатель на буфер
    18. Message db '------------------------Console.asm---------------------',10,13
    19. db 'Программа демонстрирует вывод на консоль сообщения,',10,13
    20. db 'которое вы сейчас видите. Использованы функции',10,13
    21. db 'GetStdHandle и WriteConsoleA',10,13
    22. db '--------------------------------------------------------'
    23. messagesize = $ - Message
    24. @@: push eax; дескриптор выходного устройства
    25.     call _imp__WriteConsoleA@20
    26.     retn
    27. end start
     
  8. aptyp

    aptyp Member

    Публикаций:
    0
    Регистрация:
    17 сен 2008
    Сообщения:
    81
    Microedition
    имел ввиду чтобы без cWritten было можно, хотя и так уже нормально ;)

    Mikl___, интересный код, постараюсь запомнить на будущее.))))))