Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > C & Assembler |
Автор: Nos 5.4.2004, 17:14 |
Коллеги! Суть дела примерно в следующем: мне необходимо вызвать прерывание (INT 21h, 35-я функция), оно вернёт мне адрес HDTP в регистры es:bx... Это я хочу сделать с помощью Ассемблера... Как мне сделать так, чтоб я смог данные из этих регистров передать в переменные, объявленные в коде Си. А может быть кто-то знает хорошую документацию по работе с прерываниями в Си, чтоб я не делал гибрид из Си и Ассемблера? Помогите, плиз! |
Автор: Guest 5.4.2004, 18:03 |
Самый банальный путь: объявляешь переменные вне какой-либо функции пример: #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 5.4.2004, 18:06 |
Самый банальный путь: объявляешь переменные вне какой-либо функции пример: #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 все в порядке. |
Автор: Дрон 5.4.2004, 18:10 | ||
Честно говоря, код тов. Guest у меня вызывает сомнения... Очень большие сомнения... Вообще делается так:
И никаких проблем ![]() Вообще-то WORD -- это есть unsigned long. Только <windows.h> -- это для Windows, а тут ведь вроде как DOS ![]() Добавлено @ 18:13 Ой! А он уже и вторую версию написал ![]() ![]() |
Автор: DenDen 5.4.2004, 18:38 |
Вообще код. тов Дрон у меня тоже вызывает некотрые сомнения. Imho,НЕЛЬЗЯ пересылать регистр-память минуя аккумулятор. |
Автор: shedon 5.4.2004, 18:49 |
у меня сейчас Borland C++ 3.1 нету, но как мне помнится в файле dos.h есть функция int86 и регистры union REGS rg: т.е. также можно вызывать прерывания |
Автор: Дрон 5.4.2004, 20:09 | ||||
2DenDen Можно. Я проверял ![]() Если не веришь, то набери в командной строке debug и проверяешь сам
Вот чего нельзя, так это пересылать командой mov из памяти в память. А вообще прав shedon. Для таких делов есть специальные функции, я и забыл о них: Для прерывания 21 есть две функции: intdos и intdosx. Только на асме всё же проще получается ![]() А ещё я вспомнил, что есть псевдопеременные (во всяком случае у Борланда) для регистров и флагов: _AX,_BX,_ES,_DS,_FLAGS и т.п. Т.е. можно просто написать:
|