;Как известно для того чтобы вывести строку на экран существует вызов процедуры invoke WriteConsoleA, ; она для выполнения вывода использует параметры stdout, ; дескриптор стандартного устройства вывода драйвера монитора ADDR msg, ; вычисленный при компиляции адрес начала выводимого сообщения на экран sizeof msg, ; вычисленное при компиляции число байтов в сообщении выводимом на экран ADDR cWritten, ; адрес где хранится число выводимых байтов сообщения выводимого на экран NULL ; просто бесполезное число ноль Объясните по возможности подробнее в чём необходимость эти двух? Код (Text): ADDR cWritten, 0
aptyp Ну вас что, в msdn'е забанили? Последнее - зарезервено, может когда-то что-то и означало, но теперь нет. А предпоследнее - количество символов, которые удалось вывести. Ну, мало ли, что бывает При нормальной работе после выполнения должно быть nNumberOfCharsToWrite == *lpNumberOfCharsWritten.
Ustus сейчас только пробил через yandex что такое есть этот msdn (LOL) В общет получается что сохранение и числа выведеных символов на экран орсуществялется навсякий случай, как и передача его процедуре? А можно ли осуществлять вывод без ного вообще (это глупый вопрос номер два)? удивительно но кто-то тоже задавал подобный вопрос http://rfpro.ru/question/29404
aptyp Завидую.... Ну не совсем... дело в том, что каждая операция ввода-вывода как бы может и не выполнится надлежащим образом. И иногда принципиально знать, до какого места она все-таки выполнилась. Так что это вопрос контроля/надежности. Судя по описанию - нет, то есть надо передавать осмысленный адрес. Но пользоваться тем что оно туда напишет вроде как никто и не заставляет.
Всё, наконец понял смысл параметра ADDR cWritten, этим параметром определяется( или устанавливается ) адрес для последующего сохранения туда числа выведенных символов которые были выведены на экран. А я долго ломал голову думая что число там уже изначально после компиляции существует. )) А по этому поводу на самом деле запутал меня вот этот код: start: invoke StrDisp, ADDR msg,sizeof msg invoke ExitProcess, 0 StrDisp proc StrAddrWORD, StrSzWORD ;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
aptyp можно не заморачиваться с использованием WriteConsole вы и имеете ввиду без WriteConsole? Ну, используйте WriteFile.
aptyp Если как написал Ustus не обрабатывать возможные ошибки то можно и так Код (Text): ; masm windows console # .686P .model flat ;32 bit memory model include windows.inc includelib kernel32.lib extern _imp__GetStdHandle@4:dword extern _imp__WriteConsoleA@20:dword .code start: xchg ebx,eax; в WinXP при старте приложения eax=0 ;Get Console Output push STD_OUTPUT_HANDLE call _imp__GetStdHandle@4 push ebx; зарезервировано push esp; сюда вернут количество записанных в Console Output символов push messagesize; размер буфера call @f; указатель на буфер Message db '------------------------Console.asm---------------------',10,13 db 'Программа демонстрирует вывод на консоль сообщения,',10,13 db 'которое вы сейчас видите. Использованы функции',10,13 db 'GetStdHandle и WriteConsoleA',10,13 db '--------------------------------------------------------' messagesize = $ - Message @@: push eax; дескриптор выходного устройства call _imp__WriteConsoleA@20 retn end start
Microedition имел ввиду чтобы без cWritten было можно, хотя и так уже нормально Mikl___, интересный код, постараюсь запомнить на будущее.))))))