Три задачки на перевод результатов сравнений в индексы. Подобные задачки используются в "нечётких сравнениях". Когда даётся величина отклонения, допустимый предел и направления отклонения. Так же это схоже с задачами на диапозоны. Во всех задачах предел даётся положительным числом и означает максимально допустимое отклонение (т.е. значение предела допускается как отклонение) Для простоты пусть во всех задачах eax - отклонение ebx - абсолютная величина предела. Индекс помещается в eax. Значение индексов 0 - если eax = 0 1 - если eax <> 0 но находится в допустимом пределе,и стороне отклонения 2 - если сторона отклонения недопустима или отклонение выходит за предел. Условие - безбранчевый код. Оптимизация по размеру. Минимизация использования регистров. Задача1. Допускается отклонение в обе стороны. т.е. if eax = 0 eax <- 0 if |eax| <= ebx eax <- 1 if |eax| > ebx eax <- 2 Задача2. Допускается отклонение только в отрицательную сторону. т.е. if eax = 0 eax <- 0 if (eax > 0) or (|eax| > ebx) eax <-2 else eax <- 1 Задача3. Допускается отклонение только в положительную сторону т.е. if eax = 0 eax <- 0 if (eax < 0) or eax > ebx eax <- 2 else eax <- 1 if eax
The Svin Спасибо за интересные задачки!!! После if'ов имеются ввиду те значения, которые были при входе в функцию. Код (Text): range1: cdq and edx,eax sub eax,edx sub eax,edx ;eax=|eax| cmp ebx,eax sbb ebx,ebx ;ebx=0 if |eax|>ebx ;ebx=-1 if |eax|<=ebx neg eax sbb eax,eax ;eax=0 if |eax|=0 ;eax=-1 if |eax|>0 add eax,ebx ;eax=0 if |eax|=0 ;eax=-1 if |eax|>0 && |eax|<=ebx ;eax=-2 if |eax|>ebx neg eax ret range2: neg eax cmp ebx,eax sbb ebx,ebx ;ebx=0 if -eax>ebx ;ebx=-1 if -eax<=ebx neg eax sbb eax,eax ;eax=0 if -eax=0 ;eax=-1 if -eax>0 add eax,ebx ;eax=0 if -eax=0 ;eax=-1 if -eax>0 && -eax<=ebx ;eax=-2 if -eax>ebx neg eax ret range3: cmp ebx,eax sbb ebx,ebx ;ebx=0 if eax>ebx ;ebx=-1 if eax<=ebx neg eax sbb eax,eax ;eax=0 if eax=0 ;eax=-1 if eax>0 add eax,ebx ;eax=0 if eax=0 ;eax=-1 if eax>0 && eax<=ebx ;eax=-2 if eax>ebx neg eax ret