Предположим, что в произвольном регистре данных содержится значение «000E0015». Как я могу скопировать первые 4 бита (000E) в другой регистр данных?68K Сборка, как скопировать первые 4 бита регистра данных
ответ
Для получения более подробной информации вам необходимо предоставить дополнительную информацию.
Во-первых, 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-, но я не совершенно точно, что вам нужно точно.
Теперь прошло 20 лет, но не должно быть 'move.l d0, d1'? Довольно точно 68K использует пункт назначения справа. – unwind
Вы хотите самое значащее слово, а не 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
Надейтесь, что это поможет?:)
Первые 4 бита будут 0, вам явно нужны верхние 16 бит –