Другое > Hard'n'Soft
вопрос по флагам процессора
(1/2) > >>
ALEX_230_VOLT:
Вообщем в универе на контрольной достался такой вопрос: "что делать если процессор не поддерживает флаг OF(а может и CF. я точно не помню формулировки вопроса)? Можно ли его как то заменить?" (ну я конечно не слово в слово, но смысл такой) На месте я ничего толкового не ответил (ну кроме того, что без этого флага уменьшится диапозон чисел) и препод, так сказать, дал время подумать.
Увы, но в инете я ответа не нашёл. Понимаю что этот форум специализируется на другом, но всё же попытка не пытка - может ктонибуть из вас придумает достойный ответ :) Заранее спасибо.
HoRRoR:
http://ru.wikipedia.org/wiki/Флаг_переполнения
Не совсем понял "перенос в старший разряд", но заменить можно. CF xor (флаг переноса в старший разряд). Остаётся только определить факт этого переноса.

А вот CF процессор уж вряд ли не поддерживает.
gepar:
ALEX_230_VOLT, CF/OF это флаги переполнения, флаг также используется при логических операциях, как ты думаешь что делать если процессор не может ничего сравнивать, можно ли его заменить ? Можно ли такой процессор назвать процессором?
Хотя я не такой уж фанат asm'а посему могу где и ошибаться с регистрами, ну и написанное мной касается intel only, можешь ещё у Хардыча спросить для убедительности.

Добавлено позже:
Прогуглил (с рассчётом может что забил  за пол года  :) ): переполнение - OF, перенос - CF.

Добавлено позже:
Об их использовании читай здесь.
HardWareMan:
Значение флагов OF и C разное (именно С а не CF! Ибо OverFlow и Carry). А вот "имитировать" их можно. Правда, С участвует в сравнении больше-меньше, что облегчает математику и его эмуляция будет громоздкой. А вот переполнение эмулировать легко, т.к. для этого всего-лишь надо анализировать старший бит числа, который является его знаком.
ALEX_230_VOLT:
Всем спасибо за ответы, но хотелось бы конкретизации. Я что-то не очень понимаю как OF может быть связано со знаком  :-\ можно показать это на конкретном примере?



Добавлено позже:
и ещё вопрос: что делают строки?
mov byte ptr [SI],C2
mov word ptr [SI],1234h
а конкретно byte ptr и word ptr
HoRRoR:
Насколько я понимаю смысл флага переполнения, OF выставляется, как частный случай, если старший бит переходит в 1 при сложении.
Т.е., на примере 8 бит, было у нас 0111111 (127), прибавляем 1, становится 10000000 (-1) - вот это и есть переполнение. С беззнаковыми числами переполнения быть не может, т.е. знак не сменится.


Истинная таблица установки флагов переноса и переполнения для сложения:

--- Код: ---Перенос из разрядной сетки Перенос в знаковый бит      Флаги
Есть Есть CF=1, OF=0
Есть Нет CF=1, OF=1
Нет Есть CF=0, OF=1
Нет Нет CF=0, OF=0

--- Конец кода ---
Разрядная сетка - это N битов N-разрядного регистра. Знаковый бит - старший бит регистра.

Добавлено позже:

--- Цитата ---и ещё вопрос: что делают строки?
mov byte ptr [SI],C2
mov word ptr [SI],1234h
а конкретно byte ptr и word ptr
--- Конец цитаты ---
Ох, ассемблер x86 уже не помню... По-моему, они записывают по адресу в SI значения C2h (байт) и 1234h (слово).
byte ptr - значит байт, word ptr - значит слово (2 байта).
HardWareMan:

--- Цитата: HoRRoR от 24 Апрель 2011, 14:24:26 ---byte ptr - значит байт, word ptr - значит слово (2 байта).
--- Конец цитаты ---
КО уточняет, что "ptr" означает "pointer", или "указатель". Т.е., команду mov byte ptr [SI],0C2h надо читать так: перенести байт 0C2h в память, указателем байта которой является [si]. Для второй команды смысл тот же, только указатель уже на слово а не байт.
ALEX_230_VOLT:
а есть ли разница если например сделать просто
mov [SI],0C2h
HoRRoR:
Конечно, тип указателя не указан, неясен размер данных, куда заносится это значение. Я точно не знаю, что произойдёт, но либо ошибка, либо возьмётся размер по умолчанию (скорей всего, в зависимости от разрядности системы под которую ассемблер).
Вот если бы ты так регистр записывал - то указатель указывал был бы на область размера регистра, а тут константа и неизвестно какого она типа.

Вот как будут выглядеть два байта по адресу SI после записью разными способами:

--- Код: ---mov byte ptr [SI],0C2h   ; [SI]: C2 ?? (второй байт не изменился)
mov word ptr [SI],0C2h   ; [SI]: C2 00 (второй байт 00, потому что значение теперь занимает 2 байта и выглядит как 00C2h)

--- Конец кода ---
Т.е. в первом случае указатель был на байт, во втором - на слово.
HardWareMan:

--- Цитата: HoRRoR от 26 Апрель 2011, 08:07:23 ---Конечно, тип указателя не указан, неясен размер данных, куда заносится это значение. Я точно не знаю, что произойдёт, но либо ошибка, либо возьмётся размер по умолчанию (скорей всего, в зависимости от разрядности системы под которую ассемблер).
--- Конец цитаты ---
Зависит от ассемблера. Касаемо константа<>память - большинство потребует указать размер. Касаемо регистр<>память - возьмет автоматом по разрядности регистра (al/ax/eax).
ALEX_230_VOLT:
сегодня вот словил препода, сказал ему смесь того что подсказали мне вы, привёл пример 01111111+1. Препод сказал что я иду в правильном направлении, но надо это всё грамотно сформулировать. Вот он например спросил что будет если числа отрицательны - там же по идее старший бит будет 1
ещё потом что то сказал нечто вроде такого: "надо следить за двумя орепандами и одним битом чтобы засечь это самое переполнение"
gepar:

--- Цитата: ALEX_230_VOLT ---надо следить за двумя орепандами и одним битом чтобы засечь это самое переполнение
--- Конец цитаты ---
Наверное всё же  операндами, а вообще круто у тебя кр работы сдавать можно, вторая неделя уж пошла.
ALEX_230_VOLT:

--- Цитата ---Наверное всё же  операндами
--- Конец цитаты ---
возможно

--- Цитата ---а вообще круто у тебя кр работы сдавать можно, вторая неделя уж пошла.
--- Конец цитаты ---
как говорится - сам тащуся :D я сам удивился такому подходу препода, т.к. вообще по закону переписывтаь модульные КР нельзя, но конерктно этот препод разрешает :) Хотя на самом деле в таком подходе есть рациональное зерно, т.к. это меня таки заставит реально разобратся во всём материале и честно заработать оценку

Добавлено позже:
так что, посоветуете ли какие нибуть уточнения на эту тему?
ALEX_230_VOLT:
зависит ли это от чётности и переноса?
gepar:
ALEX_230_VOLT,что зависит?
ALEX_230_VOLT:
ну я уже ставил вопрос: чем заменить флаг CF? с положительными числами понятно, а как с отрицательными быть?
HoRRoR:
Насколько я понимаю, если абстрагироваться от тонкостей ассемблера, то A + B даёт переполнение в случаях:

* A + B > MAX (2N-1-1, где N - разрядность)
* A + B < MIN (-2N-1)Вычитание - это сложение с инвертированным знаком второго операнда, так что для него те же правила.
Собственно, проблема стоит лишь в проверке этих условий самым эффективным способом, при чём, как я понял по условию, унифицированно для сложения и вычитания.
Вот у нас выражение X = A + B, где X обладает той же разрядностью, что A и B. В голову приходят такие возможные варианты переполнения:

* A >= 0, B >= 0. OF = 1 при X < 0.
* A < 0, B < 0. OF = 1 при X >= 0.При разных знаках не могу представить переполнение...
ALEX_230_VOLT:
а можно пример сложения отрицательных чисел чтобы было переполнение?
ALEX_230_VOLT:
правильно ли я поннимаю что -1+(-1) 11111111+11111111 это будет переполнение? или нет? вообще ведь -2 входит в диапазон допустимых значений  :-\
HardWareMan:

--- Цитата: ALEX_230_VOLT от 02 Май 2011, 14:07:05 ---правильно ли я поннимаю что -1+(-1) 11111111+11111111 это будет переполнение? или нет? вообще ведь -2 входит в диапазон допустимых значений  :-\

--- Конец цитаты ---
Нет, -2 это 11111110. А вот -128+(-128) 10000000+10000000 уже переполнение.
Навигация
Главная страница сообщений
Следующая страница

Перейти к полной версии