2016-11-08 9 views
0

У меня есть вопрос относительно инструкции MULU. Одна вещь, которую я заметил, - это предположить, что в регистре данных значение 000FFFFF. А потом предположим, что я хочу добавить еще F, чтобы он содержал 00FFFFFF. То, что я обычно делаю умножать регистр данных на 16 следующим образом:68000 Сборка: Умножение дает странный результат

MULU #16, D4 

А потом добавить еще один F, выполнив ADD инструкции (так что я получаю 00FFFFFF). Но когда я снова умножаюсь на 000FFFFF, все биты внутри регистра данных заканчиваются на нуль (00000000). После этого умножайтесь, у меня будет 000FFFF0, а затем последует остальные. Я до сих пор не понимаю причину этого. Я посмотрел this example, и я чувствую, что он должен работать. Я также заметил, что бит Extend, Carry и Zero имеет значение true, если я просто добавляю 1 к 000FFFFF

+2

Что _ «Но когда я снова умножаются на 000FFFFF» _ имею в виду? Покажите нам точную последовательность инструкций. Кроме того, почему бы вам просто не сдвинуть влево на 4 вместо умножения на 16? – Michael

+0

Вы правы. Я не должен был использовать умножение. Вместо этого сдвиг влево на 4 является хорошим решением. Задача решена. –

ответ

1

Не используйте умножение. Вместо этого используйте LSL.L # 4, (register), и это даст результат, который будет необходим намного лучше.

0

Я считаю, что причина этого результата связана с ограничением множителя в 68000. IIRC может обрабатывать только 16-битные значения, поэтому, когда вы начинаете иметь дело со значениями, выходящими за рамки этого, вы получаете такой результат.

То, что другие заявили, является наиболее эффективным способом умножения на значение с силой 2 (сдвиг влево). То же самое верно и для деления, поскольку сдвиг вправо эффективно делит значение.

Кроме того, если вы работаете с подписанными значениями, убедитесь, что использовать Арифметика Сдвиги, а не логических сохранить знак (особенно для разделения :))

+0

Это правда. Выполнение такого рода умножения дает 32-битный результат. –

Смежные вопросы