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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.06.2011, 18:37   #1
confistu
Новичок
Джуниор
 
Регистрация: 15.06.2011
Сообщений: 1
По умолчанию Подпрограммы и прерывания в ассемблер

Не могу разобраться с подпрограммами в ассемблер (встроенный в Turbo Pascal ассемблер)
Для начала хотелось бы увидеть просто программу в которой при нажатии клавиши выдавалось бы какое-нибудь сообщение. Сообщение храниться в @data (здесь уже мне становиться непонятно как это описывать), подпрограмма выводящая сообщение – это по сути обработчик прерывания, ну т.е. в коде пишем

Цитата:
uses DOS;
var SvInt09: procedure;

procedure MyInt; interrupt;
label msg,next;
begin
asm
jmp Next
Msg: db ' press $' { можно ли это где-нибудь еще выше хранить, например до }
Next: { определения процедуры MyInt, там какой-то @data вроде должен
push ds { использоваться }
push cs
pop ds
mov ah, 9
mov dx, offset Msg
int 21h
pop ds
end ;
Inline($9C);
SvInt09;
end;

{$F-}
{label EhcoLoop,EchoDone;}
begin
GetIntVec(09,@SvInt09); { используется досовская подмена прерываний }
SetIntVec(09,@MyInt09); { а хотелось бы асм. код вызывающий подпрограмму }
readln; { а вместо readln MOV ah, 0; }
SetIntVec(09,@SvInt09); { INT $16; }
end.

Строку вроде бы можно как-то так вытаскивать
Цитата:
asm
mov ax,SEG @Data { какой-то SEG и метка с данными }
mov ds,ax { в сегмент данных записали место в памяти где начинается первый }
end; { элемент из @data, а если у меня там 2 строки, то нужны две метки и offset }
А главное хотелось бы увидеть код который при нажатии разных клавиш, заставлял динамик пищать по разному. Не могу понять как работает CALL и как определять (и вызывать) ассемблерные подпрограммы из ассемблерного же кода.

Цитата:
ассемблерная подпрограмма
считать код клавиши (толи скан код толи ASCII код ?)
сравнить значение с определенный кодом (например код клавиши Q)
если равно выдать один звук
уменьшить счетчик С (толи брать переменную C, толи можно работать с рег. CX)
jmp @end {выход из подпрограммы}
сравнить значение с определенный кодом (например код клавиши W)
если равно выдать другой звук
уменьшить счетчик С
jmp @end {выход из подпрограммы}
увеличить счетчик на 1 {если не нажата не Q не W}
@end:
выход из процедуры (где-то здесь должна быть команда RET)

основная программа
mov CX, 10; {позволяем нажать клавишу со звуком минимум 10 раз}
@emul:
выполнять какое-нибудь действие, эмулируем работу какой-нибудь программы
происходит нажатие клавиши
вызываем прерывание
обработчик прерывания не стандартный, а ассемблерная подпрограмма
где-то здесь должна быть команда CALL
loop @emul
Знаю что динамиком управляют через порт 61h и порты системного таймера 41h-43h, но так и не разобрался в кодах которые находил в интернете. А на Турбо Паскале вообще не нашел (в основном встречал MASM)

Вообще не могу понять как оно должно работать, весь интернет забит описанием того что происходит при вызове CALL и практически отсутствуют примеры, в крайнем случае кусок кода в пару строк, вместо полноценной программы с комментариями.

Где-то на форуме видел пример с факториалом, там функция называлась factorial и ей передавалось в качестве параметра число n, а потом в асм. коде этой же функции писали CALL Factorial (рекурсия тобишь), вот для меня непостижимо как можно вызывать Функции только по имени, откуда она потом параметр входной берет… Ну в общем помогите кто может (а то сами понимаете лето – сессия… , нервы, ночь, улица, фонарь, аптека, недосып, глаз у меня вот уже дергается)
confistu вне форума Ответить с цитированием
Старый 16.06.2011, 04:02   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> откуда она потом параметр входной берет

из стека или из регистров (по соглашению).
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ассемблер.Подпрограммы. Аннэтт Помощь студентам 1 18.01.2011 05:11
прерывания lilek Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 14.12.2010 20:44
Делфи и ассемблер. Не работают прерывания типа Int Я_и Общие вопросы Delphi 8 11.12.2010 13:13
Подпрограммы-процедуры, подпрограммы-функции в Pascal rishikesh Помощь студентам 19 18.05.2010 23:05
Ассемблер и подпрограммы 4yvak123 Фриланс 4 10.08.2009 19:28