Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C & Assembler, Совместная работа... 
:(
    Опции темы
Nos
  Дата 5.4.2004, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Коллеги! Суть дела примерно в следующем: мне необходимо вызвать прерывание (INT 21h, 35-я функция), оно вернёт мне адрес HDTP в регистры es:bx... Это я хочу сделать с помощью Ассемблера... Как мне сделать так, чтоб я смог данные из этих регистров передать в переменные, объявленные в коде Си. А может быть кто-то знает хорошую документацию по работе с прерываниями в Си, чтоб я не делал гибрид из Си и Ассемблера? Помогите, плиз!


PM MAIL   Вверх
Guest
Дата 5.4.2004, 18:03 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
Дата 5.4.2004, 18:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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 все в порядке.


  Вверх
Дрон
Дата 5.4.2004, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



Честно говоря, код тов. Guest у меня вызывает сомнения... Очень большие сомнения...

Вообще делается так:

Код
void main(){
unsigned short Segment,Offset;
_asm{
 mov ax, 0x35
 int 0x21
 mov Segment, es
 mov Offset,  bx
}
}

И никаких проблем smile.gif

Вообще-то WORD -- это есть unsigned long. Только <windows.h> -- это для Windows, а тут ведь вроде как DOS smile.gif

Добавлено @ 18:13
Ой! А он уже и вторую версию написал smile.gif Вот она будет работать правильно. Только зачем мучаться, ведь компилятор позволяет использовать имена переменных в ассемблерном коде smile.gif


--------------------
Да. Именно так.
PM   Вверх
DenDen
Дата 5.4.2004, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вообще код. тов Дрон у меня тоже вызывает некотрые сомнения. Imho,НЕЛЬЗЯ пересылать регистр-память минуя аккумулятор.
PM MAIL   Вверх
shedon
Дата 5.4.2004, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 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
PM MAIL WWW ICQ   Вверх
Дрон
Дата 5.4.2004, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



2DenDen Можно. Я проверял smile.gif
Если не веришь, то набери в командной строке debug и проверяешь сам
Код
mov word ptr [xxxx],es
mov word ptr [yyyy],bx
Прекрасно работает.

Вот чего нельзя, так это пересылать командой mov из памяти в память.

А вообще прав shedon. Для таких делов есть специальные функции, я и забыл о них:
Для прерывания 21 есть две функции: intdos и intdosx. Только на асме всё же проще получается smile.gif

А ещё я вспомнил, что есть псевдопеременные (во всяком случае у Борланда) для регистров и флагов: _AX,_BX,_ES,_DS,_FLAGS и т.п.
Т.е. можно просто написать:
Код
_AX = 0x35; // или просто 35, я номера функций не знаю :)
_asm int 0x21
Segment = _ES;
Offset  = _BX;


Это сообщение отредактировал(а) Дрон - 5.4.2004, 20:11


--------------------
Да. Именно так.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




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


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

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