Дано двойное слово и два битовых индекса (переменные) младший и старший. Привести биты в двойном слове младше младшего индекса в состояние бита по данному младшему индексу старше старшего индекса в состояние бита по старшему индексу. Пример младший индекс 8 старший 24 двойное слово 01011101 01010000 100111100 01010001 значение бита по млашему индексу 0 значение бита по старшему индексу 1 Значит нужно привести двойное слово к виду 11111111 01010000 100111100 00000000 Повторюсь все три значения на входе - переменные. Задачка под номером 3. Sorry - не знаю как поправить тему
Код (Text): mov edx, 0BAA13C51h ; initial value mov ecx, 8+1 ; low index or eax, -1 shl eax, cl and edx, eax not eax bt edx, ecx sbb edi, edi and edi, eax add edx, edi mov ecx, 24+1 ; high index or eax, -1 shl eax, cl bt edx, ecx sbb edi, edi and edi, eax not eax and edx, eax add edx, edi mov eax, edx
Код (Text): mov eax,num mov cl,high_index xor cl,31 shl eax,cl sar eax,cl mov cl,low_index bt eax,cl rcr eax,1 sar eax,cl inc cl rol eax,cl
Код (Text): shr eax,low_index+1 sbb ecx,ecx shld eax,ecx,low_index+1 shl eax,32-high_index sbb ecx,ecx shrd eax,ecx,32-high_index Так можно исключить один сдвиг Код (Text): shr eax,low_index+1 sbb ecx,ecx shld eax,ecx,32-high_index+low_index+1 sbb ecx,ecx shrd eax,ecx,32-high_index Или пару байт Код (Text): shl eax,31-high_index cdq shrd eax,edx,32-low_index sbb edx,edx shld eax,edx,low_index+1
Можно ешё сдвиг исключить (не предел?), вместо него пусть лучше будет вычитание индекса Код (Text): shl eax,31-high_index sar eax,32-low_index sbb ecx,ecx shld eax,ecx,low_index+1