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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2012, 07:45   #1
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию [ASM] FLAGS

Нужно проверить Int флаг, только один бит. Читал, что получить содержимое регистра флагов можно с помощью
Код:
mov ax, FLAGS
, но реально, например, на emu8086, это не получается. Дальше я думал насчет того, что можно применить операции сдвига, а затем уже сравнивать ax на соответствие с прерыванием. Но есть же, наверное, что-то адекватное, а не такие операции?
Krasi вне форума Ответить с цитированием
Старый 16.02.2012, 08:13   #2
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

В 8086 неплохо работала связка
Код:
pushf
pop ax
и дальше с помощью test проверять необходимый бит.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 16.02.2012, 10:04   #3
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Krasi
Для загрузки значений флагов в регистр EFLAGS и считывания из него предназначены команды LAHF, SAHF, PUSHF, PUSHFD, POPF и POPFD. Значение любого флага всегда можно проверить, для этого нужно сохранить содержимое регистра EFLAGS в стек, затем извлечь его в регистр общего назначения и проверить командами TEST или BT. Изменить значения флагов можно путём загрузки его через стек из регистра общего назначения, но некоторые флаги таким образом изменить нельзя (например, двухбитовое поле IOPL в защищённом режиме).
Флаг разрешения прерываний (IF – Interrupt enable flag) находится в 9-ом бите, поэтому команда lahf не подходит, тогда вся программа
Код:
pushf; содержимое flags в стек
pop ax; содержимое стека в регистр ax
test ah,10b; проверяем 9-ый бит на равенство нулю
jz a1; если IF=0 идем на метку а1

Последний раз редактировалось Mikl___; 16.02.2012 в 12:02.
Mikl___ вне форума Ответить с цитированием
Старый 16.02.2012, 10:05   #4
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Ок, но я не использую стек. Пока еще не дошло, как без него Либо можно ли вообще? А то я не использую ОЗУ. То есть lahf и shr-shl - это без стека? Но sahf же не получает данные с регистра состояний, а загружает их туда?

Последний раз редактировалось Krasi; 16.02.2012 в 10:35.
Krasi вне форума Ответить с цитированием
Старый 16.02.2012, 10:07   #5
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Krasi
Это как не используешь? Из религиозных соображений? Команды pushf и pop ax в 8086 существовали
Mikl___ вне форума Ответить с цитированием
Старый 16.02.2012, 10:45   #6
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Специально посмотрел в справочник
LAHF—Load Status Flags into AH Register .
SAHF—Store AH into Flags.
Маленькое но — регистр AH 8-разрядный, а Interrupt enable flag находится в 9-ом бите (а отсчет идет с нулевого бита) поэтому только через PUSHF
Mikl___ вне форума Ответить с цитированием
Старый 16.02.2012, 20:23   #7
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

И что делать? Мне не охота прикручивать ОЗУ к схеме только из-за этого казуса, но надо как-то проверить, что таймер в МПС закончил считать, и лучше с применением прерывания. Хотя... int же автоматически загружает данные в стек? А если не поставлю ОЗУ, то никак не сделаю int+ret? Ну можно просто jmp, ну не знаю. Короче, ставить ОЗУ, или нафиг она не нужна по мелочам? Как мне проверить по-грамотнее изменение сигнала на выходе таймера?

Блин, я понял, что имеется недопонимание: как вообще организовать прерывание? Вот я подал на некоторое время "0" на INTR#, а что дальше?

Последний раз редактировалось Stilet; 17.02.2012 в 11:21.
Krasi вне форума Ответить с цитированием
Старый 17.02.2012, 04:12   #8
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Цитата:
Блин, я понял, что имеется недопонимание:
в первом топике пишешь mov ax,FLAGS в принципе неверная команда, но раз упоминается регистр АХ значит речь идет о микропроцессоре Intel x86, там же упоминается emu8086 что еще раз это подтверждает. Дальше понесло бредом,
Цитата:
я не использую стек... Мне не охота прикручивать ОЗУ к схеме только из-за этого казуса... А если не поставлю ОЗУ
если речь идет о компьютере с микропроцессором Intel x86, то ничего ставить уже не нужно, есть и ПЗУ и ОЗУ, и стек, и соответствующие мнемонические команды, перечисляю по тексту ТС упоминает команды: MOV, LAHF, SHR, SHL, SAHF, и, подразумевается, что есть устройство для ввода этих команд, и какая-то примитивная операционная система, типа БИОС, чтобы прочитать эти команды с носителя (клавиатуры, флешки, перфоленты) в ОЗУ, и какое-то устройство вывода, ведь ТС как-то должен увидеть результат действия этих команд. Но если речь идет о каком-то микроконтроллере, где ничего перечисленного нет -- тогда об этом нужно писать в первых строках первого сообщения
Флаг IF – Interrupt enable flag в регистре FLAGS разрешает или запрещает использовать прерывания, сам механизм прерывания имеет программную реализацию, связанную с созданием вектора прерывания, но об этом лучше читать в книжке
Цитата:
Вот я подал на некоторое время "0" на INTR#, а что дальше?... Как мне проверить по-грамотнее изменение сигнала на выходе таймера?
Тогда нужно обращаться не в раздел низкоуровневое программирование на ассемблере, а в раздел железо

Последний раз редактировалось Mikl___; 17.02.2012 в 06:12.
Mikl___ вне форума Ответить с цитированием
Старый 17.02.2012, 10:46   #9
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Ну правильно же, что во время прихода сигнала INTR#, единичного, кстати (таймер выдает "0", а дальше ставлю инвертор) флаг устанавливается в "0" вплоть до iret? Я не на компьютере, а сам пробую собрать систему, поэтому могут быть и казусы. Но сейчас я спрашиваю именно про то, как получить данные из IF, если стека нету. Но я еще не понял, как сдвиги работают, вроде без ОЗУ никак, а я вчера еще хотел схему без ОЗУ. Но я не в курсе, может можно и без ОЗУ?
Krasi вне форума Ответить с цитированием
Старый 17.02.2012, 11:10   #10
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Krasi
Цитата:
Я не на компьютере, а сам пробую собрать систему, поэтому могут быть и казусы
С этого предложения и стоило начать топик, а собирать систему, наверное, стоило начать с микропроцессора intel 8008, или даже с intel 4004 (на какой помойке или в каком музее только это можно найти?)
Цитата:
Рассмотрим подробнее аппаратные прерывания. В компьютере есть программируемый контроллер прерываний, котогрый тесно взаимосвязан с процессором:
При возникновении аппаратного прерывания инициируется выход #INT контроллера. Он напрямую соединен с входом #INTR процессора. Если флаг IF=0, прерывание отбрасыватеся. Процессор опрашивает вход #INTR после выполнения каждой инструкции. Как только обнаруживается сигнал, процессор сразу же подтверждает прерывание через выход #INTA. Контроллер прерываний принимает сигнал INTA и выставляет на шину данных значние номера прерывания. Процессор считывает номер прерывания и входит в прерывание по описанной выше схеме. Контроллер прерываний 8259A имеет восемь входов IRQ0-IRQ7, открытых для внешних источников, выход INT и вход INTA, соединенные с #INTR и #INTA входом и выходом процессора соответственно. При получении внешнего прерывания на шине данных формируется номер прерывания из суммы IRQ-номера входа и некоторого базового значения, которое обычно равно восьми, а в защищенном режиме придется базу сдвинуть до 20h, как именно - смотри ниже. Таким образом, при получении сигнала на входе IRQ0 генерируется прерывания 8 (у нас будет 32), IRQ1 - 9 (33) и так далее.
При поступлении нескольких заявок от разных источников они обрабатываются по порядку начиная с меньшего номера IRQ. Можно также выборочно заблокировать некоторые заявки от отдельных IRQ-входов. Блокировку, или маскирование заявок, а так же выбор заявки с наибольним приоритетом обеспечивают три байтовых регистра контроллера - interrupt Mask register (iMr), interrupt Request register (iRr), interrupt Service register (iSr) и арбитр приоритетов Page Resolver (PR).
Каждый вход IRQ блокируется отдельным битом регистра масок iMr. Если прерывания на входе IRQn разрешены, бит n регистра iMr сброшен. Регистр маски iMr подключен к порту 21h процессора.
Пусть поступление запросов на вход IRQn разрешено - бит n регистра iMr сброшен. Бит n регистра запросов на прерывание iRr установится, когда придет сигнал на вход IRQn. Арбитр приоритетов PR по значению регистра iSr принимает решение о возможности обслуживания запроса. Заявка может быть принята к обслуживанию, если в регистре iSr не зафиксировано заявок с равным или большим номером. Если все нормально, контроллер выставляет сигнал INT. Заявка принимается к обслуживанию при получении сигнала INTA от процессора, на шину данных выставляется номер прерывания, бит n регистра iRr сбрасывается, бит n регистра iSr устанавливается. Установленный бит n регистра iSr теперь блокирует прерывания от входов с номерами большими либо равными n. Блокировку необходимо снять вручную в процедуре обсдуживания прерывания сбросом бита x в регистре iSr, который подключен к порту 20h (нужно записать значение 3Nh, где N - номер входа). На практике обычно пользуются командой неопределенного сброса, реализуемой посылкой в порт 20h значения 20h. По этой команде в iSr сбрасывается заявка с наименьшим номером - которая обслуживается в данный момент как наиболее приоритетная.
8 входов слишком мало, поэтому чаще всего используются два контроллера прерываний 8259A - так называемые ведомый контроллер, выход INT которого подключен к входу IRQ2 ведущего контроллера, который уже в свою очередь общается с процессором. Это называется каскадным включением контроллеров прерываний. Регистр iMr ведомого контроллера доступен через порт 0a1h, а регистр iSr - через 0a0h.
Взято здесь

Последний раз редактировалось Mikl___; 17.02.2012 в 11:16.
Mikl___ вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача параметров asm-asm Maksimall89 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 22.12.2011 11:54
asm dosha Фриланс 2 04.03.2011 01:59
Asm в С++ ge4r Помощь студентам 0 17.10.2010 17:26
[c++]asm Nightwalker Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 14.10.2008 19:39