Asm вставки в С

  • Автор темы HerrOberst
  • Дата начала
H

HerrOberst

#1
Хочу использовать в программе написанной на си ассемблерные вставки, однако компилятор ругается:
Код:
|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
 

lazybiz

Well-known member
03.11.2010
1 339
0
#4
По-обычному - это вот так:
C++:
__asm {
mov eax, ecx
}
Какой у тебя компилятор?
 
H

HerrOberst

#5
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");
Это из-за чего, из-за использования прерываний??? Как установить видеорежим??
 
H

HerrOberst

#7
Как установить видеорежим??

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

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

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

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

lazybiz

Well-known member
03.11.2010
1 339
0
#8
Я это реализовал уже силами WinApi, однако не смог решить проблему с затиранием изображения при развертывании
Не совсем понял, что значит "с затиранием при развертывании" ?
Можешь показать что у тебя получилось?
 
H

HerrOberst

#9
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
 

Вложения

lazybiz

Well-known member
03.11.2010
1 339
0
#10
Тебе обязательно нужно в консольном окне рисовать? Почему не создать отдельное окно? Есть какое-то условие задания?
 

lazybiz

Well-known member
03.11.2010
1 339
0
#11
Так тебе не подойдет?
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;
}
 
H

HerrOberst

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

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

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

lazybiz

Well-known member
03.11.2010
1 339
0
#13
Консоль в полноэкранном... У вас препод извращенец. Я подумаю просто про консоль.