Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Непонятки с прерываниями

43K
14 ноября 2008 года
mrDIMAS
3 / / 14.11.2008
Написал графический движок на VC++, а GDI'шные функции винды работают как черепахи, вот и решил взять MASM32 и написать функции работы с графикой(вывод точек,линий ), но не тут-то было.
Итак суть проблемы в том что на MASM32 пишу вот это
 
Код:
.386
.model MEDIUM,C
.code
start:
mov ax,13h
int 10h
ret
end start

затем компилю в exe. НО! при запуске, программа сразу же вылетает на строке где вызываю прерывание int 10h , в чем проблема не знаю( я новичок в низкоуровневом программированиии ), вроде в регистр все правильно засовываю (режим VGA 320*240*256). Подскажите пожалуйста чё делать. Плиз очень надо

заранее спасибо
3.7K
14 ноября 2008 года
_lobster_
115 / / 10.04.2005
Цитата: mrDIMAS
Написал графический движок на VC++, а GDI'шные функции винды работают как черепахи, вот и решил взять MASM32 и написать функции работы с графикой(вывод точек,линий ), но не тут-то было.
Итак суть проблемы в том что на MASM32 пишу вот это

.386
.model MEDIUM,C
.code
start:
mov ax,13h
int 10h
ret
end start

затем компилю в exe. НО! при запуске, программа сразу же вылетает на строке где вызываю прерывание int 10h , в чем проблема не знаю( я новичок в низкоуровневом программированиии ), вроде в регистр все правильно засовываю (режим VGA 320*240*256). Подскажите пожалуйста чё делать. Плиз очень надо

заранее спасибо



EXE собирай как DOS приложение, в винде такие прерывания не работают.

43K
14 ноября 2008 года
mrDIMAS
3 / / 14.11.2008
может быть тупой вопрос но как указать чтобы exe собиралось как dos приложение( вроде с расширением com ) ?
3.7K
14 ноября 2008 года
_lobster_
115 / / 10.04.2005
Цитата: mrDIMAS
может быть тупой вопрос но как указать чтобы exe собиралось как dos приложение( вроде с расширением com ) ?


И exe может запускаться с под доса. Для начала, на твоем бы месте, я бы сменил masm на tasm и почитай вот эту статейку http://wasm.ru/article.php?article=1022003

43K
24 ноября 2008 года
mrDIMAS
3 / / 14.11.2008
Спасиб чувак, очень помог.
15K
25 ноября 2008 года
Vertecs
116 / / 21.06.2008
Цитата: mrDIMAS
Написал графический движок на VC++, а GDI'шные функции винды работают как черепахи, вот и решил взять MASM32 и написать функции работы с графикой(вывод точек,линий ), но не тут-то было.
Итак суть проблемы в том что на MASM32 пишу вот это
 
Код:
.386
.model MEDIUM,C
.code
start:
mov ax,13h
int 10h
ret
end start
затем компилю в exe. НО! при запуске, программа сразу же вылетает на строке где вызываю прерывание int 10h , в чем проблема не знаю( я новичок в низкоуровневом программированиии ), вроде в регистр все правильно засовываю (режим VGA 320*240*256). Подскажите пожалуйста чё делать. Плиз очень надо

заранее спасибо

А не проще, как альтернатива, создать битовую карту с прямым доступом к пикселам?

Код:
HDC NewBitMap(BYTE **buf, HBITMAP *bmp)
{
    HDC dc;
    BYTE i, data[2000]={0};
    BITMAPINFOHEADER *bh=(BITMAPINFOHEADER*)data;
    RGBQUAD *pal=(RGBQUAD*)(data+sizeof(*bh));
    bh->biSize=sizeof(*bh);
    bh->biWidth=640;  // Ширина
    bh->biHeight=480; // Высота
    bh->biPlanes=1;
    bh->biBitCount=4; // Кол-во бит на пиксел. Здесь режим EGA
    bh->biClrUsed=bh->biClrImportant=16;
    for(i=0; i<16;   // Настройка палитры
        pal.rgbRed=(i>7?0xFF:0x7F)*((i>>2)&1),
        pal.rgbGreen=(i>7?0xFF:0x7F)*((i>>1)&1),
        pal[i++].rgbBlue=(i>7?0xFF:0x7F)*(i&1));
    *bmp=CreateDIBSection(0,(BITMAPINFO*)bh,DIB_RGB_COLORS,(void**)buf,NULL,0);
    dc=CreateCompatibleDC(0); SelectObject(dc,*bmp);
    return dc;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
...
        case WM_TIMER:
            hdc = GetDC(hWnd);
            BitBlt(hdc, 0, 0, 640, 480, DisplayDC, 0, 0, SRCCOPY);
            ReleaseDC(hWnd, hdc);
            break;
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            BitBlt(hdc, 0, 0, 640, 480, DisplayDC, 0, 0, SRCCOPY);
            EndPaint(hWnd, &ps);
            break;
        case WM_DESTROY:
            if(DisplayDC) DeleteDC(DisplayDC);
            if(DisplayBmp) DeleteObject(DisplayBmp);
            KillTimer(hWnd, hTimer);
            PostQuitMessage(0);
            break;
        case WM_CREATE:
            DisplayDC = NewBitMap(&DisplayBits, &DisplayBmp);
            for(long i = 0; i < 640 * 480 / 2; DisplayBits[i ++] = 0);
            hTimer = SetTimer(hWnd, 1, 40, NULL);
            // Где:
            // int      hTimer;
            // HBITMAP  DisplayBmp;
            // HDC      DisplayDC;
            // BYTE *DisplayBits; // Сюда и будем строить всю графику прямой записью в память
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог