Вопрос № 70663: Привет...
Работаю с FPU...
Не знаю как считать флаги регистра состояний SR...
Вот регистр SR:
| В С3 TOP С2 С1 С0 ES РЕ UE ОЕ ZE DE IE |
Нашел вот такую команду:
FSTSW AX - Сохраняет текущее значение регистра SR в пр...Вопрос № 70666: Помогите начинающему программисту как правильно откомпилировать и получить COM-файл в MASM611.Просьба разложите пример 1-ый из книги "Ассемблер это просто!" по полочкам непосредственно запуск MASM611 и получение COM-файла.Спасибо!...Вопрос № 70695: Уважаемые эксперты!
Почему максимальное значение SP равно FFFE, а не FFFF ?
И что находится в FFFF ?
...Вопрос № 70741: Привет экспертам...
Я недавно давал вопрос - как считать флаги регистра SR сопроцессора... увидел ответы и понял, что не во всей полноте поставил вопрос... написал пояснение в мини-форуме - ответа пока нет...
ID моего вопроса 70663. Дайт...
Вопрос № 70.663
Привет...
Работаю с FPU...
Не знаю как считать флаги регистра состояний SR...
Вот регистр SR:
| В С3 TOP С2 С1 С0 ES РЕ UE ОЕ ZE DE IE |
Нашел вот такую команду:
FSTSW AX - Сохраняет текущее значение регистра SR в приемник (регистр АХ или 16-битная переменная)...пол дела СДЕЛАНО...
Как мне эти биты повыдерать с регистра AX и записать в выделенные под них переменные?...Или может быть есть другой способ решить данную задачу?
Заранее спасибо...
Отправлен: 12.01.2007, 18:08
Вопрос задал: BugZex (статус: Посетитель)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Олег Владимирович
Здравствуйте, BugZex!
Да, первый шаг сделан - FSTSW AX.
А можно вопрос - зачем выделять по одному байту на каждый однобитный флаг?
(Россия - щедрая душа :), но всё же)
Их можно проверять прямо в AX по мере надобности. Удобно пользоваться командой TEST AX,0020h, допустим. Она, не меняя операндов, устанавливает флаги так же, как и AND AX,20h. Так что если бит 5 (PE) в AX установлен, она сбросит ZF; если бит 5 в AX сброшен, получится ZF=1.
Если проверка нужна после сравнения (FCOM и т.п.), применяйте FSTSW AX и следом за ней SAHF, копирующую AH в младший байт регистра флагов. После них можно применять те же команды перехода, что и при сравнении беззнаковых.
Удачи!
--------- Факультет ПМ-ПУ - лучший в СПбГУ!
Ответ отправил: Олег Владимирович (статус: 10-ый класс)
Ответ отправлен: 12.01.2007, 18:31
Отвечает: Евгений Иванов
Здравствуйте, BugZex!
Это флаги. Используй команду TEST для взятие их значений.
TEST EAX,1
JNZ установлен
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор) Россия, Нижний Новгород Тел.: +78313145721 Организация: M2Media.ru Адрес: Нижний Новгород, ул.Малая Ямская WWW:Eugene Ivanov ICQ: 214889076 ---- Ответ отправлен: 12.01.2007, 18:35
Отвечает: ramok
Здравствуйте, BugZex!
флаги не принято "выдергивать и записывать в выделенные под них переменные".
с флагами обычно работают с помощью команд булевых операций and(И), or(ИЛИ), xor(Исключающее ИЛИ) или специальные команды типа test. В сочетании с командами условного перехода jz, jnz и так далее.
Посмотрире в своем учебнике главу по перечисленным командам
Ответ отправил: ramok (статус: 8-ой класс)
Ответ отправлен: 12.01.2007, 19:01
Отвечает: Лысков Игорь Витальевич
Здравствуйте, BugZex!
В случае языка С и ASM вставок:
Запиши в байтовую переменную bRes значение AH после FSTSW AX
Определи имена битов
#define SF 0x80
#define ZF 0x40
#define AF 0x10
#define PF 0x04
#define CF 0x01
И анализируй при помощи команд типа
IF (bRes & ZF) ... // взведен флаг Z
PS Можно сохранить и AX в слове, потом анализировать биты слова
--------- Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Практикант)
Ответ отправлен: 15.01.2007, 10:50
Вопрос № 70.666
Помогите начинающему программисту как правильно откомпилировать и получить COM-файл в MASM611.Просьба разложите пример 1-ый из книги "Ассемблер это просто!" по полочкам непосредственно запуск MASM611 и получение COM-файла.Спасибо!
Отправлен: 12.01.2007, 18:20
Вопрос задал: Koks777 (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: IceWolf
Здравствуйте, Koks777!
Посмотрите вот эти ответы:
http://rusfaq.ru/info/Question/68300
http://rusfaq.ru/info/question/66551
http://rusfaq.ru/info/question/63325
С уважением, IceW0|f.
--------- Идеальных защит не существует, ибо то, что создано человеческим разумом, им же будет и разрушено!
Ответ отправил: IceWolf (статус: 6-ой класс)
Ответ отправлен: 13.01.2007, 02:44 Оценка за ответ: 5 Комментарий оценки: Спасибо,очень рад.Живу в Казахстане и советоваться не с кем.
Вопрос № 70.695
Уважаемые эксперты!
Почему максимальное значение SP равно FFFE, а не FFFF ?
И что находится в FFFF ?
Отправлен: 12.01.2007, 22:30
Вопрос задал: Andrej11 (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Олег Владимирович
Здравствуйте, Andrej11!
В стэк можно записывать и извлекать из него как минимум 2 байта сразу (заметьте, команды POP AL нету!).
Поэтому обычно в SP хранятся чётные числа.
Однако, в него вполне возможно поместить 0FFFFh, но POP AX тогда вызовет ошибку, ведь она попытается прочитать байт по адресу SS:10000h, а он не существует.
PS
Кстати, на мой взгляд, максимальное значение SP есть 0, означающее, что стэк размером 64К пуст.
Удачи!
--------- Факультет ПМ-ПУ - лучший в СПбГУ!
Ответ отправил: Олег Владимирович (статус: 10-ый класс)
Ответ отправлен: 12.01.2007, 22:54
Отвечает: IceWolf
Здравствуйте, Andrej11!
Известно, что программу можно завершить(если вы не толкали ничего в стэк, или затем выровняли его) инструкцией ret. Эта инструкция извлекает из стека адрес и передаёт по нему управление. Так вот при запуске программы в стеке лежит число 0, поверьте в отладчике. Т.е. управление будет передано по адресу CS:0, а там находятся байты CD20-код INT 20h-завершение программы. Т.е. при старте стэк не пуст, там лежит 0, записаный туда загрузчиком.
С уважением, IceW0|f.
--------- Идеальных защит не существует, ибо то, что создано человеческим разумом, им же будет и разрушено!
Ответ отправил: IceWolf (статус: 6-ой класс)
Ответ отправлен: 13.01.2007, 02:25
Отвечает: Евгений Иванов
Здравствуйте, Andrej11!
Эти два эксперта ответили по большинству правильно, а именно то, что в стек записываются командой push сразу чётное число байт (4 или 2).
Но никакого максимального значения нет.
Если про размер стека, то он равен размеру установленного сегмента для стека и может быть любым значением от байта до 4 Гб.
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор) Россия, Нижний Новгород Тел.: +78313145721 Организация: M2Media.ru Адрес: Нижний Новгород, ул.Малая Ямская WWW:Eugene Ivanov ICQ: 214889076 ---- Ответ отправлен: 13.01.2007, 19:45
Вопрос № 70.741
Привет экспертам...
Я недавно давал вопрос - как считать флаги регистра SR сопроцессора... увидел ответы и понял, что не во всей полноте поставил вопрос... написал пояснение в мини-форуме - ответа пока нет...
ID моего вопроса 70663. Дайте ответ пожайлуста...
Отправлен: 13.01.2007, 13:55
Вопрос задал: BugZex (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: ramok
Здравствуйте, BugZex!
> Все не так ПРОСТО!....
> Я пишу на СИ ( BCB ) и делаю asm вставки...
| В С3 TOP С2 С1 С0 ES РЕ UE ОЕ ZE DE IE |
все советы остаются в силе. флаги сохраняются в переменную, после чего в коде С с помощью логических операндов проверять на наличие или отсутствие флага.
& это and (применятся для обнуления бит и проверки на наличие установленного бита)
| это or (используется для установки бит)
^ это xor (используется для инвертации нужных битов)
примерный пример в приложении
> Так как компилятор от Borland, то там нет команд условного перехода. Поэтому здесь надо как-то по другому поступить...
команды условного перехода во встроенном ассемблере борланда тоже есть.
пример 2 делает тоже что и 1 только силами ассемблера
Приложение:
Ответ отправил: ramok (статус: 8-ой класс)
Ответ отправлен: 13.01.2007, 17:02