impressive17
@impressive17

Как происходит работа с short в asm?

У меня есть работа с переменной char
Вот кусок кода
short right = acum & 65535;
short left = acum » 16;
и я вижу в asm коде вот это
00000230: andi r16,r16,65535
//тут происходит инверсия знакового бита как я понимаю
00000234: xori r16,r16,32768
00000238: addi r16,r16,-32768
Подскажите пожалуйста смысл таких преобразований? Зачем последняя операции сложения нужна?
  • Вопрос задан
  • 124 просмотра
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
00000234: xori r16,r16,32768
00000238: addi r16,r16,-32768

Это классическое расширение знакового бита, в данном случае для 16-битного числа: если бит 15 был установлен (число отрицательное), то после xor он будет сброшен (т.е. он и все биты старше него станут нулями), а после addi бит 15 и все старше него станут единицами. Если бит 15 был сброшен (число неотрицательное), то после xor он будет установлен, а после addi -- сброшен опять.

Подскажите пожалуйста смысл таких преобразований?

Знаковое расширение -- это часть short right = acum & 65535;. Оно нужно для того, чтобы работать с загруженными в регистры значениями не задумываясь об исходной ширине их типа данных. Т.е. (short)-1 в 64-битном регистре будет представлен как 0xffffffffffffffff, а не как 0xffff.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы