![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Nos |
|
|||
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 29.3.2004 Репутация: нет Всего: нет |
Коллеги! Суть дела примерно в следующем: мне необходимо вызвать прерывание (INT 21h, 35-я функция), оно вернёт мне адрес HDTP в регистры es:bx... Это я хочу сделать с помощью Ассемблера... Как мне сделать так, чтоб я смог данные из этих регистров передать в переменные, объявленные в коде Си. А может быть кто-то знает хорошую документацию по работе с прерываниями в Си, чтоб я не делал гибрид из Си и Ассемблера? Помогите, плиз!
|
|||
|
||||
Guest |
|
|||
Unregistered |
Самый банальный путь:
объявляешь переменные вне какой-либо функции пример: #include<windows.h>//ya ne pomu, chnto est WORD po suti WORD off; WORD seg; int main() { __asm { mov ax,35h//esli eto deistvitelno tak int 21h push es } } |
|||
|
||||
Guest |
|
|||
Unregistered |
Самый банальный путь:
объявляешь переменные вне какой-либо функции пример: #include<windows.h>//ya ne pomu, chnto est WORD po suti WORD off; WORD seg; int main() { __asm { //something .... mov ax,35h//esli eto deistvitelno tak int 21h push es push bx pop off pop seg } return something; } Только ты не обольщайся. Насколько я помню в 2000,XP тебе никто прерывания вызывать не даст.В 98 все в порядке. |
|||
|
||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
Честно говоря, код тов. Guest у меня вызывает сомнения... Очень большие сомнения...
Вообще делается так:
И никаких проблем ![]() Вообще-то WORD -- это есть unsigned long. Только <windows.h> -- это для Windows, а тут ведь вроде как DOS ![]() Добавлено @ 18:13 Ой! А он уже и вторую версию написал ![]() ![]() -------------------- Да. Именно так. |
|||
|
||||
DenDen |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 25.3.2004 Репутация: нет Всего: нет |
Вообще код. тов Дрон у меня тоже вызывает некотрые сомнения. Imho,НЕЛЬЗЯ пересылать регистр-память минуя аккумулятор.
|
|||
|
||||
shedon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1209 Регистрация: 17.1.2003 Где: Нижнiй Новгородъ Репутация: 4 Всего: 11 |
у меня сейчас Borland C++ 3.1 нету, но как мне помнится в файле dos.h
есть функция int86 и регистры union REGS rg: т.е. также можно вызывать прерывания -------------------- Programming is like sex: One mistake and you have to support it your lifetime |
|||
|
||||
Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
2DenDen Можно. Я проверял
![]() Если не веришь, то набери в командной строке debug и проверяешь сам
Вот чего нельзя, так это пересылать командой mov из памяти в память. А вообще прав shedon. Для таких делов есть специальные функции, я и забыл о них: Для прерывания 21 есть две функции: intdos и intdosx. Только на асме всё же проще получается ![]() А ещё я вспомнил, что есть псевдопеременные (во всяком случае у Борланда) для регистров и флагов: _AX,_BX,_ES,_DS,_FLAGS и т.п. Т.е. можно просто написать:
Это сообщение отредактировал(а) Дрон - 5.4.2004, 20:11 -------------------- Да. Именно так. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |