1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

Asm вставки в С

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

  1. HerrOberst

    HerrOberst Гость

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

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

    Я так понял GCC использует инлайновски ассемблер, поэтому пробовал писать, что-то вроде такого:
    Код:
    asm("movl %eax, %ebx");
    ругается:
    Код:
    |187|undefined reference to `asm'
    Пробовал и по обычному:
    Код:
    asm
    {
    mov ax ,13h
    int 10h;
    }
    Здесь, даж еще похуже):
    Код:
    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 Гость

    Репутация:
    0
    Попробуйте:
    Код:
    __asm("movl %eax, %ebx");
     
  3. ensane

    ensane Гость

    Репутация:
    0
  4. lazybiz

    lazybiz Well-Known Member

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

    HerrOberst Гость

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

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

    lazybiz Well-Known Member

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

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

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

    HerrOberst Гость

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

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

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

    lazybiz Well-Known Member

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

    HerrOberst Гость

    Репутация:
    0
    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

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

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Так тебе не подойдет?
    Код:
    #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 Гость

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

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

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

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Консоль в полноэкранном... У вас препод извращенец. Я подумаю просто про консоль.
     
Загрузка...

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