Asm вставки в С

Тема в разделе "Общие вопросы по С и С++", создана пользователем HerrOberst, 13 дек 2010.

  1. HerrOberst

    HerrOberst Гость

    Хочу использовать в программе написанной на си ассемблерные вставки, однако компилятор ругается:
    Код (Text):
    |189|undefined reference to `asm'|
    OC - windows 7
    компилятор - GCC
    среда - code::blocks

    Может надо дополнительную библиотеку подключить, иль прописать чего????

    Я так понял GCC использует инлайновски ассемблер, поэтому пробовал писать, что-то вроде такого:
    Код (Text):
    asm("movl %eax, %ebx");
    ругается:
    Код (Text):
    |187|undefined reference to `asm'
    Пробовал и по обычному:
    Код (Text):
    asm
    {
    mov ax ,13h
    int 10h;
    }
    Здесь, даж еще похуже):
    Код (Text):
    error: |187|'asm' undeclared (first use in this function)
    error: |187|(Each undeclared identifier is reported only once
    error: |187|for each function it appears in.)
    error: |188|expected ';' before '{' token
    error: |189|invalid suffix "h" on integer constant
    error: |190|invalid suffix "h" on integer constant
     
  2. ierofant

    ierofant Гость

    Попробуйте:
    Код (C++):
    __asm("movl %eax, %ebx");
     
  3. ensane

    ensane Гость

  4. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    По-обычному - это вот так:
    Код (C++):
    __asm {
    mov eax, ecx
    }
    Какой у тебя компилятор?
     
  5. HerrOberst

    HerrOberst Гость

    to ierofant
    Спасибо получилось, из-за этой, точнее двух недостоющих черточек, три дня в чтениях и раздумьях пребывал....

    Мне ето надобыло, чтобы установить графический режим, однако используя прерывание int 10h (int $0x10), после него программа вылетает. Пробовал всякие варианты (ниже видеорежим 640*200*16):
    Код (Text):
    __asm volatile("movl $0x000E, %eax\n"
    "int $0x10");
    Думал, что винда не позволяет, видорежимы устанавливать и т.д. Решил хоть символ вывести - но и здесь прога вылетила...
    Код (Text):
    __asm volatile("movl $0x0941, %eax\n"
    "xor %ebx,%ebx\n"
    "movl $5, %ecx\n"
    "int $0x10");
    Это из-за чего, из-за использования прерываний??? Как установить видеорежим??
     
  6. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Да.

    DirectDraw тебе в помощь.

    Зачем тебе DOS-приложение запускать из-под Windows?
     
  7. HerrOberst

    HerrOberst Гость

    Того требует контрольная( - преподу лень заморачиваться и он использует виндовский эмулятор терминала...

    Мне ассемблер требовался для вывода на экран растрового изображения по пиксельно. Я это реализовал уже силами WinApi, однако не смог решить проблему с затиранием изображения при развертывании, либо при скрытии его его из виду - консоль не принимает сообщения Windows - вот еще одна моя темка по данному вапросу.
    Да и подход в отлове сообщений WM_Paint для дос приложений не лучший вариант...
    А как сделать так, чтобы вывести изображение и оно не затиралось - не могу придумать..(((
    Рисовать силами <graphiks.h> - эт борландская древняя библиотека - ее у меня нету, а при попытке поставить - тянет за собой хвосты: не может найти <sstream.h>

    По поводу DirectDraw - тож не лучшее решение, моя програмулька начнет зависеть от сторонних установленных приложений...
     
  8. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Не совсем понял, что значит "с затиранием при развертывании" ?
    Можешь показать что у тебя получилось?
     
  9. HerrOberst

    HerrOberst Гость

    to lazybiz,
    Вот как сделать, чтобы ето "чудо" не затиралось при всяческих перемещениях...?)

    Для вывода изображения использовал WinApi(шную) функцию SetPixel(), может можно как-нить по другому вывести, чтобы потом не играться с отловом сообщений WM_PAINT.
    А если, без WinApi никуда - то как-всеж таки контролировать целостность изображения? Пытался ловить WM_PAINT, но у меня это не получилось - точнее консоль вообще не принимает никаких виндовых сообщений...

    При использовании Code::Blocks необходимо внести в настройки среды пару параметров:
    Settings->Compiler and debugger->Global compiler settings->Other options -std=c99->Ok
    Settings->Compiler and debugger->Global compiler settings->Linker settings->Add \CodeBlocks\MinGW\lib\libgdi32.a->Ok
     

    Вложения:

    • c01v16C.rar
      Размер файла:
      37,8 КБ
      Просмотров:
      8
  10. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Тебе обязательно нужно в консольном окне рисовать? Почему не создать отдельное окно? Есть какое-то условие задания?
     
  11. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Так тебе не подойдет?
    Код (C++):
    #include <windows.h>
    #include <stdio.h>

    #define     W       320
    #define     H       240

    char        g_szWindowName[]    = "test";
    char        g_szWindowClass[]   = "test32";
    HWND        g_hWnd;
    HBITMAP     g_hBitmap;

    static LRESULT CALLBACK wnd_proc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
    {
    switch ( uMsg ) {
    case WM_PAINT: {
    HDC         hDC;
    PAINTSTRUCT ps;
    BeginPaint( hWnd, &ps );

    hDC = CreateCompatibleDC( ps.hdc );
    SelectObject( hDC, g_hBitmap );
    BitBlt( ps.hdc, 10, 10, 100, 90, hDC, 0, 0, SRCCOPY );
    DeleteDC( hDC );

    EndPaint( hWnd, &ps );
    } return 0;

    case WM_KEYDOWN: if ( (int)wParam != VK_ESCAPE ) break;
    case WM_DESTROY:
    PostQuitMessage( 0 );
    return 0;
    }
    return DefWindowProc( hWnd, uMsg, wParam, lParam );
    }

    int APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
    {
    MSG         msg;
    WNDCLASS    wc;

    g_hBitmap = LoadImage( NULL, "karlson.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );

    memset( &wc, 0, sizeof( WNDCLASS ) );
    wc.style            = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc      = wnd_proc;
    wc.hInstance        = hInst;
    wc.lpszClassName    = g_szWindowClass;
    wc.hbrBackground    = (HBRUSH)GetStockObject( WHITE_BRUSH );
    RegisterClass( &wc );

    g_hWnd = CreateWindowEx( WS_EX_TOPMOST,
    g_szWindowClass, g_szWindowName, WS_OVERLAPPEDWINDOW | WS_VISIBLE,
    (GetSystemMetrics( SM_CXSCREEN ) >> 1) - (W >> 1),
    (GetSystemMetrics( SM_CYSCREEN ) >> 1) - (H >> 1),
    W, H, NULL, NULL, hInst, NULL );

    while ( GetMessage( &msg, NULL, 0, 0 ) ) {
    TranslateMessage( &msg );
    DispatchMessage( &msg );
    }

    DestroyWindow( g_hWnd );
    UnregisterClass( g_szWindowClass, hInst );
    return 0;
    }
     
  12. HerrOberst

    HerrOberst Гость

    В том то и вся фишка, что в консоли нарисовать требуется...

    А что если консоль перед выводом изображения, консоль развернуть на весь экран (full screan)

    Тогда вопрос, будет ли рисоваться изображение силами WinApi, при таком полноэкранном режиме?
    И как етот самый полноэкранный режим сделать (Alt + Enter)??
     
  13. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Консоль в полноэкранном... У вас препод извращенец. Я подумаю просто про консоль.
     
Загрузка...
Похожие Темы - Asm вставки
  1. MisterJohn
    Ответов:
    0
    Просмотров:
    1.414
  2. DarkPerl
    Ответов:
    1
    Просмотров:
    1.594
  3. acorn
    Ответов:
    1
    Просмотров:
    7.515

Поделиться этой страницей