OSDev

для всех
Текущее время: 28 мар 2024, 20:28

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Арифметический сдвиг
СообщениеДобавлено: 14 июн 2016, 18:24 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
А арифметический сдвиг - это не оксюморон? Присутствие слова "арифметический" не должно будоражить математическую общественность. Канонической арифметики тут, очевидно, нет, это просто игра битов. Надо бы найти и посмотреть спецификацию "арифметического сдвига", очевидно в описании команды SAR должно быть всё подробно описано.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Арифметический сдвиг
СообщениеДобавлено: 20 июн 2016, 13:11 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Intel® 64 and IA-32 Architectures Software Developer’s Manual
Volume 2 (2A, 2B & 2C):
Instruction Set Reference
SAR/SHR Description

Shifts the bits in the first operand (destination operand) to the left or right by the number of bits specified in the
second operand (count operand). Bits shifted beyond the destination operand boundary are first shifted into the CF
flag, then discarded. At the end of the shift operation, the CF flag contains the last bit shifted out of the destination
operand.

The shift arithmetic right (SAR) and shift logical right (SHR) instructions shift the bits of the destination operand to
the right (toward less significant bit locations). For each shift count, the least significant bit of the destination
operand is shifted into the CF flag, and the most significant bit is either set or cleared depending on the instruction
type. The SHR instruction clears the most significant bit; the SAR instruction sets or clears the most significant bit to correspond
to the sign (most significant bit) of the original value in the destination operand. In effect, the SAR instruction fills
the empty bit position’s shifted value with the sign of the unshifted value.

The SAR and SHR instructions can be used to perform signed or unsigned division, respectively, of the destination
operand by powers of 2. For example, using the SAR instruction to shift a signed integer 1 bit to the right divides
the value by 2.

Using the SAR instruction to perform a division operation does not produce the same result as the IDIV instruction.
The quotient from the IDIV instruction is rounded toward zero, whereas the “quotient” of the SAR instruction is
rounded toward negative infinity. This difference is apparent only for negative numbers. For example, when the
IDIV instruction is used to divide -9 by 4, the result is -2 with a remainder of -1. If the SAR instruction is used to
shift -9 right by two bits, the result is -3 and the “remainder” is +3; however, the SAR instruction stores only the
most significant bit of the remainder (in the CF flag).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Арифметический сдвиг
СообщениеДобавлено: 21 июн 2016, 12:13 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
Himik,
мы знаем, что делает инструкция SAR. Вопрос был в том, нужна ли эта инструкция в том виде, в котором существует, или нет.

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Арифметический сдвиг
СообщениеДобавлено: 21 июн 2016, 15:15 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Yoda, я не сразу понял какой вопрос, действительно много букв. Инструкцию SAR не применял ни разу. Ну а евклидово/неевкливово деление - это заморочки отдельных математиков этим весьма нелогическим (я бы сказал ошибочным) постулатом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Арифметический сдвиг
СообщениеДобавлено: 25 июн 2016, 15:44 

Зарегистрирован: 10 окт 2013, 14:54
Сообщения: 93
SAR? Конечно нужна...
Даже в нынешнее время быстрого деления, думаю sar несколько быстрее div?
Компиляторы, однако, её и генерят на 2/4/8/16/итд


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Арифметический сдвиг
СообщениеДобавлено: 27 июн 2016, 12:18 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
Yoda писал(а):
...Вопрос был в том, нужна ли эта инструкция в том виде, в котором существует, или нет.

Посмотрите, я ведь даже написал конкретные причины, почему эта инструкция плохо подходит для деления на степени двойки.

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Арифметический сдвиг
СообщениеДобавлено: 27 июн 2016, 19:19 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
И всё-таки она работает, хоть и не так как задумано.
Но если её и уберут, то ни чего страшного, я думаю, не случится.
Надеюсь, IDIV работает почти так же быстро. Если у кого есть тесты, протестируйте скорость деления на 64.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Арифметический сдвиг
СообщениеДобавлено: 28 июн 2016, 06:52 

Зарегистрирован: 10 окт 2013, 14:54
Сообщения: 93
Yoda писал(а):
Посмотрите, я ведь даже написал конкретные причины, почему эта инструкция плохо подходит для деления на степени двойки.
Ну, помимо деления на степень двойки - существует ещё и обычный сдвиг. Никто, ж, не отменял int cc = aa>>bb;
Да и в целочисленном делении - по хорошему, стоило бы давать опцию юзеру...

Вообще - с какой стати необходимость инструкции определяется только языками высокого уровня? Если так мерять - давайте и bt, btc, bts итд уберём - один фиг их никто не генерит...

Попробуйте в один бутсектор или MBR впихнуть что-ньть не совсем тривиальное - и все "ненужные" инструкции мигом пойдут в дело, чтобы уместиться в эти 400 с копейками байт. Просто привычка к ЯВУ и "гигабайтам" - подобный процесс почти убила, а жаль ;)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Арифметический сдвиг
СообщениеДобавлено: 13 сен 2017, 22:53 

Зарегистрирован: 12 апр 2017, 10:25
Сообщения: 25
Арифметический сдвиг вправо можно использовать для работы с битовыми полями.
Например в 32 битном числе первые пять битов число со знаком.
v32 = v5 << 27 >> 27;
Тоже самое правда можно сделать и без сдвигов.
v32 = v5 | (0 - (v5 & 0x00000010));
Но больше на одну команду получается.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB