Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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 у меня вызывает сомнения... Очень большие сомнения...

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

Код
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

Автор: 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 Можно. Я проверял 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;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)