вверх, желательно без условых переходов и переполнений. Мб у кого есть хороший способ подскажите пожалуйста?
shr ecx, 12
хммм а оно вврех округлится?
Обычный сдвиг не катит?
сейчас проверил, да это обычное деление то оно округляет вниз, а мне надо вверх
А как насчёт того чтобы `&`ом получить остаток и если есть добавить 1
Потенциально можно конвертнуть результат в булеан и добавить его к инту(ещё бы я мог в асм, лол)
да вот в том то и загвоздка как конвертнуть инт в булеан без условных переходов
смысл получать остаток если он при div итак будет находится в edx?
А чем плохо переполнение?
ну делить с округлением вверх можно по формуле (x + y - 1) / y но здесь x + y может переполниться же и в итоге ответ неверный будет
Ну используй пару регистров. add, adc, shrd потом.
add ecx,4096-1 sar/shr ecx,12
Уже выше обсуждали. 0xffffffff / 4096 с округлением вверх = 0x100000, а с этим кодом получится ноль.
Можно заменить shr на rcr и потом маской убрать лишние биты слева. Тогда будет правильный результат для последних 4096 значений в диапазоне.
Наверное можно пренебречь
да. в єтом случае 0xffffffff = -1.
add ecx,(1 shl 12)-1 rcr ecx,1 sar ecx,12-1
Да, так будет короче, чем с маской.
Обсуждают сегодня