Поиск:

Ответ в темуСоздание новой темы Создание опроса
> asm-прерывания на vc++, программа аварийно закрывается 
:(
    Опции темы
fullnull
Дата 20.7.2009, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 23.7.2007

Репутация: нет
Всего: нет



Здравствуйте. Простой вопрос не отнимет у Вас много времени.
Простейшая программа, скомпилированная с помошью Visual C++ Toolkit 2003,
Код

#include <iostream>
using namespace std;

int main()
{
    char message[] = "Hello World!$";

    _asm {
        mov ah,9
        lea dx,message
        int 21h ;завершается здесь
    }

    cin.get();
}

не работает, завершается при выполнении int 21h. Вообще, не терпит команды int. Это особенность vc++ или еще что?
Надеюсь на Вашу помощь.
PM MAIL   Вверх
GoldFinch
Дата 20.7.2009, 00:22 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



Это особенность windows. в windows прерывания DOS не работают.
PM MAIL ICQ   Вверх
Lazin
Дата 20.7.2009, 05:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 2
Всего: 154



Цитата(GoldFinch @  20.7.2009,  00:22 Найти цитируемый пост)
Это особенность windows. в windows прерывания DOS не работают.

а инструкцию процессора int, вообще нельзя в обычных программах использовать
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 20.7.2009, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



Lazin, можно написать
_emit 0xCD
_emit 0x21

PM MAIL ICQ   Вверх
W4FhLF
Дата 20.7.2009, 07:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: нет
Всего: 121



Цитата(Lazin @  20.7.2009,  05:23 Найти цитируемый пост)
а инструкцию процессора int


Для отладочных прерываний(int 1 / int 3) можно.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
ParaPik
Дата 20.7.2009, 15:05 (ссылка)    | (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



Дело в том, что в защищенном режиме работы микропроцессора имеются так называемые кольца привилегий. Их всего 4(0, 1, 2, 3).
0-ой по другому называют режимом ядра, т.к. на этом уровне работает Windows. А программы, которые компилирует Visual C++ имеют уровень привилегий 3(самый низший). 3-ий также называют режимом пользователя. На этом уровне нельзя выполнять след. и некоторые другие команды(а точнее их разновидности): int, iret, out, in, lmsw, smsw, lgdt, lldt. WinAPI функции находятся на более привилегированном уровне. И для их вызова используется команда sysenter. Когда микропроцессор встречает одну из следующих команд, то сравнивает поле RPL в сегментном регистре cs. Если это поле равно 3, то выбрасывается исключение(вид прерывания), на которое должна отреагировать OS.
PM MAIL   Вверх
dumb
Дата 20.7.2009, 21:15 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: нет
Всего: 158



ParaPik, почитай еще литературу. а пока не пиши о внутреннем устройстве windows - не вводи людей в "ступор".
PM MAIL   Вверх
GoldFinch
Дата 20.7.2009, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



ParaPik, ты написал чушь
PM MAIL ICQ   Вверх
ParaPik
Дата 21.7.2009, 11:24 (ссылка)   | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



Во-первых, я пишу то, о чем читал, GoldFinch. А, во-вторых, если бы можно было использовать все команды для пользовательских приложений, то я мог бы сам установить привилегию, которая мне нужна с помощью команд call far, retf.(Но и это только половина работы)

Это сообщение отредактировал(а) ParaPik - 21.7.2009, 15:52
PM MAIL   Вверх
GoldFinch
Дата 21.7.2009, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



ParaPik, и то что ты читал - чушь.

Добавлено через 29 секунд
или то что ты читал - не чушь, но ты не так понял то что прочитал.
PM MAIL ICQ   Вверх
ParaPik
Дата 21.7.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



1) Я описался. Микропроцессор должен анализировать CPL(как я понял, он берется из DPL дескриптора).
2) Я читал Юрова и Пирогова. Если это чушь, то я не знаю тогда, что читать.
PM MAIL   Вверх
GoldFinch
Дата 21.7.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



ParaPik, ты плохо их читал, они такого не пишут
PM MAIL ICQ   Вверх
ParaPik
Дата 21.7.2009, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



Правильно. Они пишут только основу(Хотя как основу. Они совсем немного не добирают до полноты изложения. А эти нюансы можно прочитать в отдельных статьях). Что конкретно тебя смущает? То, что я написал какие команды не доступны на 3-ем уровне. Так это другие профессионалы написали. А потом все подтвердилось на практике. А про анализ микропроцессора тоже у известных лиц прочитал. Правда, в своем сообщении я несколько отошел от прерываний. Вернее было бы сказать, что команда-то разрешается. Но при вызове прерывания происходит сравнение CPL с полем DPL в дескрипторе таблицы прерываний. Это поле и определяет, кто может вызывать это прерывание,а кто нет. Ну, вроде уже все конкретизировал.

Это сообщение отредактировал(а) ParaPik - 21.7.2009, 17:58
PM MAIL   Вверх
GoldFinch
Дата 21.7.2009, 19:09 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



Цитата(ParaPik @  20.7.2009,  16:05 Найти цитируемый пост)
0-ой по другому называют режимом ядра, т.к. на этом уровне работает Windows. А программы, которые компилирует Visual C++ имеют уровень привилегий 3(самый низший). ... WinAPI функции находятся на более привилегированном уровне. И для их вызова используется команда sysenter. 

вкратце,

код в Windows  может выполняться на уровне ядра или на пользовательском уровне. Ядро винды по определению выполняется на ядерном уровне*;  драйвера, винды или пользовательские тоже работают в кернелмоде. Юзермодный код винды и пользовательские процессы работают в юзермоде. Что характерно, код винды, ядерный или юзермодный ничем не отличается от пользовательского.
WinAPI функции - это юзермодные функции.


*kernel.dll тоже называется "ядро", а работает в юзермоде. 
PM MAIL ICQ   Вверх
Cheloveck
Дата 21.7.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Цитата(ParaPik @  20.7.2009,  16:05 Найти цитируемый пост)
WinAPI функции находятся на более привилегированном уровне.

Я слышал о какой-то ОС, которая использует первый и второй уровень, но это не винда. Винда, как и большинство ОСей, используют только 0 и 3


--------------------
user posted image
PM Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0846 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.