Код (Text): #include <windows.h> void main(void) { char *lpBuffer="Hello, World!\n"; DWORD dw; WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), lpBuffer, lstrlenA(lpBuffer), &dw, NULL); }
что не так ? открыл консоль (win>выполнить>cmd) оттуда exe : .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib .data stdout dd ? msg db "Ќjkjhkjпаа34!",0dh,0ah cWritten dd ? .code start: invoke GetStdHandle, STD_OUTPUT_HANDLE mov stdout, eax nx: invoke WriteConsoleA, stdout, ADDR msg, \ sizeof msg, ADDR cWritten, NULL jmp nx end start ничего нигде не отображается
[оффтоп] не вижу ничего, что указывает на параметры линковки или привязки к процессу консоли... эдд: за исключением прототипа фнк. main
Тут неважно, с чего начинать. Си - обычный язык для описания алгоритмов, его следует хотя бы понимать.
Ну почитай RTFM. Именно сигнатура (прототип) ф-ции - точки входа и определяет SUBSYSTEM проги. По дефолту, если точка входа - main, то будет генериться консольная прога (/SUBSYSTEM:CONSOLE), если WinMain - GUI прога (/SUBSYSTEM:WINDOWS), etc. (ну если ты в настройках линкера не указал чего-то другого) Т.е., в MSVS линкер сам определяет, какую прогу компилить. И "на параметры линковки или привязки к процессу консоли" указывает именно сигнатура точки входа (main, WinMain, etc.).
спецом себя назвать не могу, но MSVC думает так, на сколько я знаю. +если из графического интерфейса компилишь, то там в свойствах то ли проекта, то ли солюшена есть пункт подсистема, где указывается явно.
м-м-м-да.... krid24, вы действительно правы. если не указать в параметрах проекта точку входа и указать подсистему "не задано", то он сам ищет точку входа.
если вводить в консоль символы с клавиатуры через функцию ReadConsole и сохранять первые 3 параметра для чего функции WriteConsoleA число введённых с клавиатуры символов BSIZE equ 3 .data buf db BSIZE dup(?) stdout dd ? stdin dd ? .code start: invoke GetStdHandle, STD_OUTPUT_HANDLE mov stdout, eax invoke GetStdHandle, STD_INPUT_HANDLE mov stdin, eax New: invoke ReadConsole, stdin, ADDR buf,\ BSIZE, NULL, NULL invoke WriteConsoleA, stdout, ADDR buf,\ BSIZE, NULL, NULL JMP New end start
простите, ничего не понял... но машинально понял, что код "должен"(в чём я не уверен) выводить то, что ввели. а ей надо это число, чтобы вывести ровно столько символов, сколько ввели(мы же можем ввести всего один символ, а при первом запуске в буфере будет стековой мусор) и функции надо давать всё, что она требует.