| Другое > 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 уже переполнение. |
| Навигация |
| Главная страница сообщений |
| Следующая страница |