Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Войти
 
Страницы: 1
RSS
Не открывается консоль
 
Знач написал программку на ассемблере которая должна выводить текст в консоли,но консоль не открывается
ошибок нету ехе создался щелкаю и ничего.в чем может быть проблема?
 
так ты бы хоть код показал. а так что тебе можно сказать ?
 
Не зависимо на каком языке ты пишешь программу нужно в свойствах проекта поставить консольное приложение

или
AllocConsole();
HANDLE h=GetStdHandle(STD_OUTPUT_HANDLE)  ;// или STD_ERROR_HANDLE
DWORD Res;
WriteConsole(h,”Текст”,5,&Res,NULL);
Для корректного вывода русских букв необходимо их выводить в Unicode
WriteConsoleW(ConsoleHandle,L”Текст”,10,dRes,NULL);

//============= Пример C++ Builder 6.0 ======================

#include <windows.h>
#include <stdio.h>
HANDLE ConsoleHandle;

wchar_t * ConvertAnsiToUnicode_(char * InputStr,wchar_t * Buffer,int LenString,int MaxBufferLen){
 if(MaxBufferLen==-1)
   MaxBufferLen=65535;

 MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED ,InputStr,LenString,(LPWSTR)Buffer,MaxBufferLen);
 Buffer[LenString]=0;
 return Buffer;
};
//==========================================================­====================



//==========================================================­====================
int printf__(const char *format,...){
  va_list marker;
  va_start(marker, format);

  char Buffer[2048];
  wchar_t BufferW[sizeof((Buffer)+1)*2];

  char *  pBuffer=&Buffer[0];
  wchar_t*  pBufferW=&BufferW[0];
  int BufferSize=sizeof(Buffer);

  int WriteSize=0;
  int RealWrite=0;

  if(!ConsoleHandle){
    ConsoleHandle=GetStdHandle(STD_OUTPUT_HANDLE);
    if(!ConsoleHandle)//Консоли нет
      return 0;
   };

Loop:
 BOOL ErrorExit=true;
 BOOL bWrite=false;
try{


  WriteSize=vsnprintf((char *)pBuffer, BufferSize, format, marker);


  ErrorExit=false;

  }
  __finally{
//     if(AbnormalTermination())
    if(ErrorExit)
    {//Исключение
      goto Exit;
    };

  };//   __finally

  if(BufferSize>=WriteSize){//Окей

    DWORD dRes;
    RealWrite=WriteSize;
    ConvertAnsiToUnicode_(pBuffer,pBufferW,WriteSize,WriteSize);
    bWrite=WriteConsoleW(ConsoleHandle,pBufferW,WriteSize,&dRes,NULL);




    goto Exit;
  }else{//Не влезло
    if(pBuffer!=&Buffer)
      goto Exit;//Очень странно, но пусть останется

    BufferSize=WriteSize;
    (PVOID)pBuffer=LocalAlloc(0,BufferSize);
    (PVOID)pBufferW=LocalAlloc(0,(BufferSize+1)*2);
    goto Loop;

  };
Exit:
    if(pBuffer!=&Buffer){
      LocalFree(pBuffer);
      LocalFree(pBufferW);
      };
    va_end(marker);

    if(!bWrite)
      RealWrite=0;
    return RealWrite;

};


//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
 AllocConsole();
 printf__("Текст %s__ _","vega");
}



B вообще сейчас нет смысла писать на asm, время на разработку будет потеряно намного больше чем на работу программы. На ассемблере отлаживать и вылавливать багги очень проблематично.
Писать на ассемблере можно только определённые куски программы, скажем обработка массива, вычисления с использованием SSE.


Я сам прекрасно умею программировать на ассемблере, прочитал множество статей об оптимизации программ на ассемблере. Беру функцию на на c++, переписываю её на ассемблер, тестирую по скорости и сначала моя функция работает  медленнее раза в 2. Сравниваю ассемблерный листинг мой и сишного компилятора. Оптимизирую свой asm код и получаю 20% выигрыш в скорости.
Для вещественных чисел производительность удаётся увеличить на 50% - 150%.

Стоит смотреть на использование математических возможностей видео карт, но опять же если требуется математическая обработка больших массивов, но там уже другой ассемблер.
Страницы: 1
Читают тему