Неуспешно вградено асемблиране в C++?

Добре, така че основно написах функция за асемблиране, за да открия дали даден процес присъства по време на изпълнение. Не разбирам вградения асембли до такава степен, че въпреки че увих кода на асемблирането с обвивката на asm, той все още открива вътрешния код като C код... в общи линии става нещо подобно:

__inline bool isProcLoaded()
{
    _asm
    {
        mov ah, 0x48
        int     0x68 ; After compiling it breaks on this line, the 'int' is highlighted
        cmp ax ...
    }
}

Какъв е проблемът тук и как мога да го поправя?


person user3267146    schedule 21.03.2014    source източник
comment
Не е съвсем ясно какъв ти е проблемът? Няма да се компилира? Или дава грешка по време на изпълнение? (Проблемът с подчертаването на синтаксиса, при който редакторът погрешно интерпретира int като c ключова дума, не изглежда така, сякаш би причинил действителен проблем)   -  person jcoder    schedule 21.03.2014


Отговори (1)


Това вероятно би било, защото int е инструкция за прекъсване, която рядко е полезна в потребителски режим в днешно време, защото повечето прекъсвания са привилегировани (свързани).

Без повече подробности не мога да кажа какво се опитвате да постигнете тук, въпреки че след търсене в началото изглежда подобно на метод за откриване на SoftICE дебъгер и този код е доста древен (DOS и ранната ера на Windows), така че изглежда разумно, че на съвременната операционна система получавате 0xC0000005 STATUS_ACCESS_VIOLATION изключение.

person user2802841    schedule 21.03.2014
comment
Въпреки това, не трябва ли просто да пропусне прекъсването, тъй като не се обажда директно към 0x80? Във всеки случай, как мога да го направя така, че да върне това по друг начин и все пак да продължи да обработва останалата част от моя код? Ще работи ли luhn последователността в този случай? - person user3267146; 21.03.2014
comment
OP - Не мисля, че разбираш какво прави int. Прави 2 неща. Той променя състоянието на процесора в привилегировано състояние и прескача към вектора на софтуерното прекъсване. Изпълнението вече не е под контрола на текущия процес. Сега зависи от ОС да реши как ще продължат нещата оттук нататък. - person doron; 21.03.2014
comment
Така че където и да насоча int оттам, ОС решава какво да прави по-нататък? Това има смисъл. - person user3267146; 21.03.2014
comment
Актуализира малко отговора. - person user2802841; 21.03.2014
comment
Инструкцията int е много полезна за определени неща - дори (!) в потребителската област. Това е така, защото можете да инжектирате капани с него и по този начин да взаимодействате с дебъгер. Това не е обичайно нещо, съгласен съм, но това не е оправдание за вградения асемблер да не го поддържа. - person FrankH.; 21.03.2014