Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2008, 00:45   #1
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию Прерывания и asm в Си

Компилю в MinGW - gcc... линковщик там же ld.
Дело в том что надо мне сделать аналог int86 ( найти оригинал пока не удалось ). Наброски есть, но с асмом я пока не на ты, так что не ругаться :

Код:
asm(
        "pusha \n"
        "movb $0x00, %ah \n"
        "movb $0x13, %al \n"
        "int $0x10 \n"
        "popa \n"
    );
Код не пашет нифига... вроде синтаксис AT&T придусмотрел, все в стек положил и все вытащил.... даже незнаю ) ну как заметили знатоки, вызов функии 0х0 прерывания 0х10 установка режима видео 320х200х256.
BOBAH13 вне форума Ответить с цитированием
Старый 03.08.2008, 01:11   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Код:
#include <stdio.h>
int main()
{
	asm {
		mov	ax, 0x13
		int	0x10
	}
	puts("Hello world");
        getchar();
	return 0;
}
Но это под ДОС, разумеется. Не помню, честно говоря, разве mingw умеет делать досовый код? Рекомендую BC++ для этого. Код выше на нём работает. И, кстати, применительно к BC, скобка для asm должна быть в стиле Кернигана и Ритчи - на той же строке, что и asm.
B_N вне форума Ответить с цитированием
Старый 03.08.2008, 11:41   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Все разобрался... начал исследовать ) просто в защищенном режиме проца меня выкидывало )) сделал так

Код:
inline void gotoRM() {
    asm(
        "movl %cr0, %eax \n"
        "and $0xFE, %al \n"
        "movl %eax, %cr0"
    );
}

inline void gotoPM() {
    asm(
        "movl %cr0, %eax \n"
        "or $0x01, %al \n"
        "movl %eax, %cr0"
    );
}
И теперь можно что угодно ))

Код:
asm("movw $0x13, %ax \n int $0x10");
Вот и все ))
BOBAH13 вне форума Ответить с цитированием
Старый 03.08.2008, 14:53   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Гы ) Странно... даже смешно как то ) пока делал другую часть, эта просто напросто перестала работать. Может кто знает как в теории хотябы может выглядить код функции из dos.h ->> int86 ? вызов прерываний...

Походу не верно я разобрался ( В реальном режиме все чики пуки, а вот в защищенном не так все легко, я так понимаю в теории int86 делает переход в реальный режим процессора кладек в стек все регистры потом заносит новые которые передаются через REGS потом вызывает прерывание потом все регистры переносит в выходящий REGS и потом уже вытаскивает из стека все и обратно в защищенный режим ! Думаю все именно так... проблема для меня пока, именно переходы из защишенного в реальный и обратно...

p.s. Надеюсь ну кто нибудь подскажет, все таки форум я думаю "престижный"

Ах да, для большей ясности ) пишу свою ОС. Многое познал в ходе... соответственно щас в ядре в защищенном режиме на Си. вот такие вот пироги... может открыть тему или ветку вообще )) у меня уже и ссылок хороших много и доков... может кому будет тоже интересно, чисто для увеличение кол-во серого вещества.

Последний раз редактировалось BOBAH13; 03.08.2008 в 16:36.
BOBAH13 вне форума Ответить с цитированием
Старый 03.08.2008, 18:33   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Кто знает, есть ли возможность указать си компилятору что щас идет 16 битный код ? ну типа директив для асмов use16; [BITS 16]... или только асм ? ну народ... что вообще никого ?
BOBAH13 вне форума Ответить с цитированием
Старый 04.08.2008, 18:41   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Вообщем ясно Ни от кого не ждать помоши. Ну хотя бы в теории кто хоть немного знает подскажите реализацию int86 функции в си описанной в dos.h.

p.s. монолог выходит, скоро забанят меня как флудера
BOBAH13 вне форума Ответить с цитированием
Старый 05.08.2008, 15:33   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

BOBAH13, функция int86 вызывает функцию int86x, которая формирует в локальных переменных код вызова прерывания и вызывает его. Чтобы указать компилятору, что идёт 16-битный код нужно или брать 16-разрядный компилятор, или смотреть ключи у конкретного, вполне вероятно, что их там и не будет. Я не зря выше советовал BC++ 3.1. Переход в PM за 20 с лишним лет описан так подробно, что даже не знаю, стоит ли здесь на нём останавливаться. Главное здесь то, что он требует определённой подготовительной работы, в частности формирования IDT и GDT - обращение к памяти и прерываниям в PM происходит по дескрипторам, а не по явным адресам, остальное - забота процессора. Сам вызов прерываний при этом выглядит так же, как и в реальном режиме.

P.S. Всё-таки, не валите все вопросы в кучу.
B_N вне форума Ответить с цитированием
Старый 05.08.2008, 15:52   #8
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

да B_N знаю все что вы сказили ) Уже и читал и вникал, видимо мозгов не хватка. Ну как вернусь с моря думаю добью эту тему Спасибо хоть вам за ответы.
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
прерывания sergei64_89 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 22.04.2008 13:37
Операторы прерывания Иринкаа Общие вопросы Delphi 13 27.11.2007 21:52