2016-10-13 8 views

ответ

3

Для получения более подробной информации вам необходимо предоставить дополнительную информацию.

Во-первых, 000E0015 - это 32-битное значение. «Первые четыре» бита могут означать самые значащие биты, 0 которых он ведет. Или это может означать самые низкие четыре бита, 5. Или вы могли бы означать, что вы набрали - 000E-, который является первым шестнадцати битов (каждая четырехбитовая группа называется «грызть»).

Во-вторых, каково ваше желаемое состояние окончания? Если вы начинаете с 000E0015 в регистре, и у вас есть XXXXXXXX в регистре назначения, вы хотите, чтобы он был 000EXXXX, сохраняя значения? Вы в порядке с этим 000E0000? Или вы хотите, чтобы регистр был чем-то вроде 0000000E?

Предполагаю, пока вы не заявите иначе, что вы хотите, чтобы второй регистр получил 000E, как вы заявляете. В этом случае, если вы начинаете в d0 и хотите перейти к d1:

move.l d1,d0 
swap d1 

Это первый скопировать весь 32-битный регистр для d1, то он будет менять местами слова. d1 будет содержать 0015000E. Если вы хотите их очистить, вы можете И d1 с 0000FFFF. Если вы хотите, чтобы они содержали все, что они делали раньше, вы можете сначала подготовить 0000000E в промежуточном регистре, а затем очистить младшие биты с помощью ANDing с помощью FFFF0000, а затем ввести 0000000E из промежуточного регистра с OR-, но я не совершенно точно, что вам нужно точно.

+3

Теперь прошло 20 лет, но не должно быть 'move.l d0, d1'? Довольно точно 68K использует пункт назначения справа. – unwind

1

Вы хотите самое значащее слово, а не 1-й 4 бита, поэтому самые важные 16 бит 32-битного значения. Есть несколько способов сделать это. Если вы только собираетесь использовать это слово в качестве слова и игнорировать что-либо еще в регистре данных, вы можете безопасно использовать swap.

move.l #$000E0015,d0 ; so this example makes sense :) 
move.l d0,d1 ; Move the WHOLE value into your target register 
swap d1 ; This will swap the upper and lower words of the register 

После этого d1 будет содержать # $ 0015000E так что если вы адресуете его только как слово вы будете получить доступ к чисто части регистра данных $ 000E.

move.w d1,$1234 ; Will store the value $000E at address $1234 

Теперь, если вы собираетесь использовать остальную часть регистра данных или выполнять операции с или на это, что будет выходить за пределы 1-го слова, вы должны убедиться, что верхнее слово понятно. Вы можете сделать это достаточно легко, первый вместо того, чтобы использовать своп, используйте lsr.l

move.l #$000E0015,d0 ; so this example makes sense :) 
move.l d0,d1 ; Move the WHOLE value into your target register 
moveq #16,d2 ; Number of bits to move right by 
lsr.l d2,d1 ; Move Value in d1 right by number of bits specified in d2 

Вы не можете использовать lsr.l # 16, d1, как непосредственное значение lsX.l ограничено до 8, но вы можете укажите до 32 в другом регистре и выполните операцию таким образом.

Путем очистки (IMHO) (если вы не повторяли эту операцию несколько раз) было бы использовать AND для очистки регистра после свопа.

move.l #$000E0015,d0 ; so this example makes sense :) 
move.l d0,d1   ; Move the WHOLE value into your target register 
swap d1   ; This will swap the upper and lower words of the register 
and.l #$ffff,d1  ; Mask off just the data we want 

Это удалит все биты из регистра d1, которые не соответствуют логической маске. IE бит установлен как истина как в d1, так и в указанном шаблоне ($ ffff)

Наконец, я считаю, что наиболее эффективным и чистым способом выполнения этой задачи было бы использование clr и swap.

move.l #$000E0015,d0 ; so this example makes sense :) 
move.l d0,d1   ; Move the WHOLE value into your target register 
clr.w d1   ; clear the lower word of the data register 1st 
swap d1   ; This will swap the upper and lower words of the register 

Надейтесь, что это поможет?:)

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

  • Нет связанных вопросов^_^