Вопрос № 28556: Не могу разобраться с прерываниями, объясните новичку.
Объясните хотя бы синтаксис.
Заранее спасибо!...Вопрос № 28572: Посоветуйте, пожалуйста, учебники для начинающих...
Желательно со ссылками...
Заранее спасибо...Вопрос № 28587: Господа, я понимаю, что я достал вас своим сопроцессором, а задам вопрос касающийся этой темы в последий раз.
Есть массив целочисельных значений, адрес первого елемента занесен в si. Задача в том, что бы найти минимальное значение массива. Ниже ...Вопрос № 28597: Здраствуйте. Я только начал изучать assembler. И возникла проблема, нужно увеличить каждый элемент массива на первое число массива, до максимума. Адрес массива загружал в SI, затем к ниму добавлял первый элемент массива, но ничего не изменяется. Може...
Вопрос № 28.556
Не могу разобраться с прерываниями, объясните новичку.
Объясните хотя бы синтаксис.
Заранее спасибо!
Отправлен: 30.10.2005, 17:35
Вопрос задал: Gwest (статус: 1-ый класс)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Sager
Здравствуйте, Gwest!
И что же тебе не понятно? Какой еще синтаксис??
В досе есть прерывания. Если ты их вызываешь, то работа программы прерывается и выполняется само прерывание. В общем считай, что прерывание - это таже самая функция, которую ты можешь вызвать как call name_func. Перед вызовом прерывания нужно указать "параметры" - что конкретно оно должно сделать. Если это прерывание int 21h, то в ah указываешь номер функции 9, в dx кидаешь адрес строки. Когда прерывание вызывается, то оно делает примерно так:
смотрит в ah - это число 9?
если да, то вывести строку,
если нет, то смотреть дальше(может ты в ah указал 8 или 7 и соответственно прерывание 21h делает другие действия).
Ответ отправил: Sager (статус: Студент)
Отправлен: 30.10.2005, 21:29 Оценка за ответ: 3
Отвечает: Лысков Игорь Витальевич
Здравствуйте, Gwest!
Непонятно, что интересует: что такое вообще прерывания или конкретный набор функций, обслуживаемых прерываниями? Если первое, то краткий ответ ниже. Если второе - то спрашивай конкретнее в личку, отвечу.
Итак, под прерыванием будем понимать некий код, который обслуживает некое событие или запрос.
При этом обычное выполнение программы прерывается, пока не отработает прерывание. Перед вызовом прерывания в стек заносятся регистр флагов, CS и IP прерываемой программы.
Надо различать программные и аппаратные прерывания.
а) Программные прерывания - некий сервис, который предоставляет ОС и BIOS, для выполнения различных операций. Чтобы вызвать, надо сначала записать в нужные регистры (определяется конкретной функцией прерывания) необходимую информацию и вызвать по int прерывание. Например, последовательность команд
lea dx, sMessage ж; адрес строки в сегменте DS
mov ah,9 ; номер функции
int 21h ; вызов прерывания
отрисует на мониторе строку
б) Аппаратные прерывания отличаются от программных тем, что могут происходить в любой момент времени, например, прерывания от таймера, клавиатуры. Процессор сам вызывает нужное прерывание. После того, как отработает прерывание, управление возвращается к прерванной программе.
PS. Все это касается, разумеется, ДОС-а.
--------- Удачи!
Отвечает: Юра Устинов
Здравствуйте, Gwest!
Всё просто, прерывания процессора для вашего удобства рассматривайте как функции, процессор выполняет то, что лежит в конвейере, а при прерывании он скачет на программу-обработчик (прерывание), которая выполняет обработку текущей ситуации, например, при нажатии клавиши происходит 9 прерывание и оно обрабатывает нажатие клавиши, но вы можете сами из программы вызывать прерывание и оно будет обрабатывать данные, которые вы ей дадите.
Например прерывание 10h (в десятичной с/с 16). Чтобы перевести монитор в режим 320*200 и 256цветов нужно написать:
mov ax,13h
int 10h
Чтобы вывести точку, то вам потребуется сделать следующее:
INТ 10h АН = 0Ch — Вывести точку на экран
Ввод: АН = 0Ch
ВН = номер видеостраницы (игнорируется для режима 13h, поддерживающего только одну страницу)
DX = номер строки
СХ = номер столбца
AL = номер цвета.(С другими режимами немного сложнее)
mov ax,13h
int 10h
mov ah,0ch
mov cx,100
mov al,10
mov dx,cx
int 10h
То есть вы дали прерыванию данные,а оно их обработало.
сначала пишите int, а потом номер (незабывайте ставить h или b если вы указываете прерывание в этих системах счисления).
--------- Спасём Россию!!!
Ответ отправил: Юра Устинов (статус: 3-ий класс)
Отправлен: 01.11.2005, 07:56 Оценка за ответ: 5
Вопрос № 28.572
Посоветуйте, пожалуйста, учебники для начинающих...
Желательно со ссылками...
Заранее спасибо
Отвечает: Евгений Иванов
Здравствуйте, Ечин Сергей Валентинович!
http://msdn.microsoft.com/
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 30.10.2005, 22:54
Отвечает: Sager
Здравствуйте, Ечин Сергей Валентинович!
Тебе для дос или для виндовс?
Для дос:
Рассылка калашникова(думаю знаешь где взять), Зубков "Ассемблер для дос, виндовс и юникс"(softs.h10.ru), Абель "Программирование для IBM PC"(легко ищется в яндексе)
Для виндовс:
Продолжение рассылки Калашникова для виндовс(learnasm.narod.ru), туториалы Iczelion'a (wasm.ru), Зубков.
И еще зайди на сайт asm.shadrinsk.net - там куча всего есть.
Ответ отправил: Sager (статус: Студент)
Отправлен: 31.10.2005, 08:10 Оценка за ответ: 5
Отвечает: Юра Устинов
Здравствуйте, Ечин Сергей Валентинович!
zubkov - Ассемблер для дос,windows и unix.(В поисковике посмотри)
iczelion на wasm.ru
--------- Спасём Россию!!!
Ответ отправил: Юра Устинов (статус: 3-ий класс)
Отправлен: 01.11.2005, 07:56
Вопрос № 28.587
Господа, я понимаю, что я достал вас своим сопроцессором, а задам вопрос касающийся этой темы в последий раз.
Есть массив целочисельных значений, адрес первого елемента занесен в si. Задача в том, что бы найти минимальное значение массива. Ниже пример "решения" в моем исполнении.
Вроде все нормально и должно работать, но нет. Присвоение min не выполняется, а по окончанию цикла ему присваивается значение NaN. Подскажите в чем моя оштбка.
Заанее всем благодарен.
Приложение:
Отправлен: 31.10.2005, 04:19
Вопрос задал: Юра (статус: 1-ый класс)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: Евгений Иванов
Здравствуйте, Юра!
INC влияет на флаг Z.
поставь эту команду после операциии сравнения.
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 31.10.2005, 08:41
Отвечает: Хузин Макс
Здравствуйте, Юра!
У тебя не правильно сделан выбор следующего элемента массива.
Задай в регистре CR точность результата
исходя из этого увеличивай значение si на 4, 8, 10.
смотри приложение.
Приложение:
Ответ отправил: Хузин Макс (статус: 1-ый класс)
Отправлен: 31.10.2005, 15:40
Вопрос № 28.597
Здраствуйте. Я только начал изучать assembler. И возникла проблема, нужно увеличить каждый элемент массива на первое число массива, до максимума. Адрес массива загружал в SI, затем к ниму добавлял первый элемент массива, но ничего не изменяется. Может подскажите что не так.
Приложение:
Отправлен: 31.10.2005, 08:22
Вопрос задал: Manner (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 11)
Отвечает: Евгений Иванов
Здравствуйте, Manner!
lea si, [mas]
mov di, 2
mov ax, [si]
mov cx, n-1
@m1:
add si, di
add [si], ax
dec cx
jnz @@m1
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 31.10.2005, 09:37
Отвечает: Хузин Макс
Здравствуйте, Manner!
будет примерно так:
lea si, mas ;si - адрес массива
push si ;сохраним адрес массива
mov cx, n ;cx - размер массива
mov ax, [si] ;ax - первый элемент массива
mov di, si ;в di будем хранить адрес максимального числа в массиве
find_max: ;find_max -> loop - поиск максимума в массиве
add si, 2 ;следующий элемент массива
cmp ax, [si] ;сравниваем на элемент больше записанного максимума
jae nomax ;если ax больше равно следующий элемент цикла
mov ax, [si] ;если [si] больше, записываем его как максимум
mov di, si ;сохраним адрес максимального элемента
nomax:
loop find_max ;следующий элемент массива
pop si ;вернуть адрес массива
mov ax, [si] ;ax - первый элемент массива
cycl:
cmp si, di ;достигли максимума?
jb end_cycl ;если да, то прекращаем работу
add [si], ax ;если нет, прибавляем первый элемент
add si, 2 ;следующий
jmp cycl ; элемент
end_cycl:
Ответ отправил: Хузин Макс (статус: 1-ый класс)
Отправлен: 01.11.2005, 08:30