Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > Вызов прерывания в Windows


Автор: Kuvaldis 23.6.2006, 20:18
Программирую на С / С++. Нужда заставила обратиться к ASM.
Не получается вызвать прерывание под Windows XP в ассемблерной вставке. Если запустить программу под borland C 3.1, то все работает. Под Builder 6 просто черный экран. А в Visual c++ мелкософтовском выдается ошибка времени выполнения. Ну Borland C - он под DOS работает, тут все понятно. В как сделать, чтобы все работало и в Windows? Заранее спасибо за ответ.

Код

int main()
{
     asm {
               push  ax
               mov   ah, 1
               mov   al, 'A'
               int     21h
              pop   ax
     }

      return 0;
}
 

Автор: Damarus 23.6.2006, 22:01
Писать программу для DOS (COM, MZ). Borland C 3.1 это и делает. Windows XP эмулируем DOS'овские прерывания для DOS'овских программ. В программе для Windows (PE - Builder 6, Visual С++) - никак. В Windows XP доступ к прерываниям есть только из режима ядра. 

Автор: Chingachguk 24.6.2006, 00:31
Цитата

Нужда заставила обратиться к ASM.


Что именно ты хочешь сделать на ASM в windows?

В вышеприведенном примере ты вызываешь функцию DOS - "READ CHARACTER FROM STANDARD INPUT, WITH ECHO", наверное это просто "пробный пример"? 

Автор: Kuvaldis 24.6.2006, 00:40
Chingachguk
Для своего курсового на С++ у нас в БГУИР (минск) 2 среды: Borland C++ 3.1 и Visual C++ 6/
Второй вариант посимпатичнее, но в этой IDE нет функций а-ля gotoxy wherex для управления курсором, что является критичным для реализации (менюшки всякие)
Хотел просто эти функции через 10h прерывание реализовать. Не судьба... 

Автор: setty 24.6.2006, 13:46
менюшки под дос я когдато писал на тасме правда (даже не псевдо а самая что не наесть графика) если надо могу выложить исходник 

Автор: Chingachguk 24.6.2006, 15:08
Цитата

Второй вариант посимпатичнее, но в этой IDE нет функций а-ля gotoxy wherex для управления курсором, что является критичным для реализации (менюшки всякие)


Неужели в консольной WIN32 программе нельзя двигать курсор? Или ты про оконное приложение - там нужно специфичные для win функции использовать, но также все есть. Вот нашел в примерах из пакета MASM32 (есть на сайте WASM.ru):

Код

locate proc x:DWORD,y:DWORD

    LOCAL hOutPut  :DWORD
    LOCAL xyVar    :DWORD

    invoke GetStdHandle,STD_OUTPUT_HANDLE
    mov hOutPut, eax

  ; -----------------------------------
  ; make both co-ordinates into a DWORD
  ; -----------------------------------
    mov  ecx, x
    mov  eax, y
    shl  eax, 16
    mov  ax, cx

    invoke SetConsoleCursorPosition,hOutPut,eax

    ret

locate endp


Имхо, и на СИ то же самое можно написать... Это Ж просто WIN API. 

Автор: Kuvaldis 24.6.2006, 15:39
1. setty!
   Спасибо за предложение и за готовность помочь. Был бы очень рад увидеть твои исходники

2. Chingachguk!!!
Огромнейшее спасибо за ИНФОРМАЦИЮ. (к сожалению пока 100 постов нет для повышения твоей репутации).  

3.  Кстати, решил свою программу откомпилировать в Borland C++ Builder 6. Он же тоже под Win, но функции досовского borland 3.1 gotoxy() и т.д. пристутствуют. Посмотрел в CPU, как они выполняются в этих двух средах.
Оказывается, что в Builder просто (!!!!!!) вызывается WIN API функция SetConsoleCursorPosition().

 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)