Не используя команды MUL(IMUL), написать минимальный по числу команд код, осуществляющий умножение регистра EAX на одну из следующих констант: 23 33 37 39 41 53 52 54 56 57 58 61 65 67 68 70 71 77 78 79 83 85 87 89 90 91 Результат желательно чтобы был в EAX, но если это увеличивает число команд, то можно в любом другом регистре. Если есть несколько различных минимальных вариантов (с различными именами регистров - не считаются различными) написать все варианты. Более чем для 5 констант код здесь не пишите, дайте другим подумать 8)
23: Код (Text): lea edx,[eax + eax*8] lea edx,[eax + edx*2] lea eax,[edx + eax*4] Или так: Код (Text): lea edx,[eax + eax*8] lea eax,[eax + eax*4] lea eax,[eax + edx*2]
еще для 23: lea ebx,[eax+eax*8] shl eax,5 sub eax,ebx lea ebx,[eax*8] lea ebx,[ebx+ebx*2] sub ebx,eax
Для любой из констант в 5 инструкции Код (Text): mov ecx,const mov edx,ecx xor eax,eax @@: add eax,edx loopnz @B
Ой, длин, чёта я пива много сегодня принял :-/ Вот так парвильно: Код (Text): mov ecx,const mov edx,eax @@: add eax,edx loopnz @B sub eax,edx
cresta А почему loopnz, а не loop? Допустим eax=10000000h, const=23. У тебя будет - F0000000h, а должно быть 70000000h
91: Код (Text): lea ecx,[eax+eax*8] lea edx,[ecx+ecx*8] lea edx,[edx+ecx] add eax,edx _G3 Ты тоже пиво пил? Должно быть 17000000h. Что собственно мой цикл и показывает
masquer Ну вот, взял и всё развлечение испортил 8( All Не ходите туда, там вас плохому научат 8) Если же вы там уже были и успели всё запомнить, то поищите другие варианты. cresta Цикл в 5 инструкций проигрывает минимальному варианту для любой из констант. Про скорость я вообще не говорю. А на переполнение можно спокойно забить.
У меня немножко завалялось, правда под константы попроще Код (Text): ;===================================================================== = add eax,eax ; eax*2 lea eax,[eax*2+eax] ; eax*3 shl eax,2 ; eax*4 lea eax,[eax*4+eax] ; eax*5 shl eax,3 ; eax*8 lea eax,[eax*8+eax] ; eax*9 shl eax,4 ; eax*16 shl eax,5 ; eax*32 ;===================================================================== = add eax,eax ; eax*2 *6 lea eax,[eax*2+eax] ; eax*2*2 + eax*2 ;===================================================================== = lea ecx,[eax*8+eax] ; eax*9 *17 lea eax,[eax*8+ecx] ; eax*9 + eax*8 ;===================================================================== = lea ecx,[eax*8+eax] ; eax*9 *18 lea ecx,[eax*8+ecx] ; eax*9 + eax*8 add eax,ecx ; eax*9 + eax*8 + eax*1 ;===================================================================== = lea ecx,[eax*8+eax] ; eax*9 *26 lea ecx,[eax*8+ecx] ; eax*9 + eax*8 lea ecx,[eax*8+ecx] ; eax*9 + eax*8 + eax*8 add eax,ecx ; eax*9 + eax*8 + eax*8 + eax*1 ;===================================================================== = mov ecx,eax ; *31 shl eax,5 ; eax*32 sub eax,ecx ; eax*32 - eax*1 ;===================================================================== = mov ecx,eax ; *33 shl eax,5 add eax,ecx ;===================================================================== = lea ecx,[eax*4+eax] ; *37 shl eax,5 add eax,ecx ;===================================================================== = shl eax,5 ; eax*32 *2596 lea ecx,[eax*8+eax] ; eax*32*9 lea eax,[ecx*8+ecx] ; eax*32*9*8 + eax*32*9 ;======================================================================