2013-11-12 6 views
1
.set AD0GDR,  0xE0034004 
... 
bitextract: .int 65472 
... 
LDR r3, =(AD0GDR) 
LDR r4, [r3] 
/*load #65472 into r5 that will be used to extract bits 6-15*/ 
LDR r5, =(bitextract) 
ADD r6, r4, r5 // extracts bits 6-15 and stores into r6 
ADD r0, r0, r6, LSR #15 // shift r6 bites off and add into r0 

Я новичок в ARM и не могу найти точный ответ в любом месте. Я пытаюсь извлечь только определенное количество бит из некоторых данных, которые мне даны, в частности, бит 6-15. Десятичное число для битов 6-15 является 65427.разборка бит-бит и смещение логического смещения

Из предыдущих мыслей, добавляя 65472 к значению, которое мне дали, в этом случае AD0GDR который 3758309380, является 3758374852.

Теперь я понимаю, что в двоичном эквиваленте ответа, добавив 65472, он поместит «1» в биты 6-15. Однако это не так. Итак, что происходит, добавляя 65427 к приведенному значению? Редактировать: Я думаю, лучший вопрос, почему добавление 65472 извлечения битов 6-15? или если это не так, что именно происходит.

И мой второй вопрос относится к LSR.

Причина, по которой я задаю вопрос раньше, заключается в том, что мне требуется «Извлечь чистый образец из битов 6:15 и сдвинуть его полностью вправо от регистра». и добавьте это значение в другой регистр. Должен ли я переносить последние 15 бит из регистра? Наверное, меня смущает формулировка в этой ситуации.

+0

Ваш учитель, по-видимому, прекратил программирование в armv5. Архитектуры с более новыми командами содержат инструкции, такие как ubfx, которые в одиночку выполняют эту работу. –

ответ

1

Чтобы получить определенные биты (независимо от платформы), вы обычно будете делать побитовое И, за которым следует логический сдвиг. В вашем случае бит 6 - 15 в шестнадцатеричном формате равен 0xFFCO, и вам нужно сдвинуть вправо на 6 бит в конце (при условии, что вы хотите, чтобы ваши биты выровнялись вправо в конце). Это означает, что вы хотите сделать

(num & 0xFFC0) >> 6 

Вам нужно будет перевести это на свой язык ...

EDIT еще один способ сделать это первый сдвиг вправо, а затем маскировать биты вы не 't want:

(num >> 6) & 0x3FF 

так как вы хотите только нижние 10 бит и хотите, чтобы все остальное было равно нулю.

Чтобы ответить на другой вопрос: «как добавление битов для извлечения числа», ответ «это не так». Операция AND является логической (побитовой) операцией, а не «добавлением». Простой пример:

abcdefgh & 0x34 = 
abcdefgh & 00111000b = 
00cde000 

Другими словами, логическое И сохранит биты cde в приведенном выше число, и установить все остальные биты в ноль (в данном конкретном примере). Надеюсь, это облегчит вам ситуацию.

+0

Согласно коду моего учителя, просто добавление битов 6-15 к значению определенных данных делает то, что позволяет мне использовать только 6-15 бит этих определенных данных. В этой ситуации нет необходимости делать логический сдвиг, я просто путаюсь, почему это работает. Я сделал другую лабораторию, которая включает тот же самый код, который я опубликовал, и он творит чудеса. –

+1

Если вы посмотрите на ответ Аки, вы увидите, что добавление маски позволит вам проверить (за одну операцию), установлен ли один из битов 6-15 (путем тестирования переполнения, если вы использовали 16-битные целые числа). Но если вы хотите что-то сделать со всеми битами, трудно понять, как ADD, а не AND дает результат, о котором вы, кажется, просите. – Floris

2

Рассмотрим меньшие значения:

000 101 xxx  000 010 xxx  000 000 xxx 
+ 000 111 000  + 000 111 000  + 000 111 000 
-------------- vs. ------------ vs. ------------ 
    1 100 xxx   1 001 xxx   0 111 xxx 

Это означает, что значение + маска >> п, извлекает 0, если значение равно 0 и 1, если значение было не равно нулю. Предпосылкой является отсутствие ненулевых битов слева от интересующей стоимости. Одно из возможных объяснений заключается в том, что обсуждаемая операция действительно была И вместо ADD.

EDIT: Несмотря на то, что добавление маски приводит к полуночному переносу, это не то, что извлекает LSR # 15; Несущий (т. Е. Выражение (битполе!= 0)) можно добавить с помощью выражения add r0,r0,r6 LSR #16

Вместо этого добавляются два бита, переносятся с весом 2 и «новый бит знака выражения (битполе - 1)». Или в табличной форме:

BF as int C BF+M LSR #2 
000 = 0 (0)  (0) 111 + 1 
001 = 1 (1)  (1) 000 + 2 
010 = 2 (2)  (1) 001 + 2 
011 = 3 (3)  (1) 010 + 2 
100 = 4 (-4) (1) 011 + 2 
101 = 5 (-3) (1) 100 + 3 
110 = 6 (-2) (1) 101 + 3 
111 = 7 (-3) (1) 110 + 3 

Я боюсь, но я не могу найти причину, чтобы сделать это из области теоремы дискретизации или DSP.

+0

Я думаю, что он смущен этой целью. Как вы показали, если какой-либо бит установлен в поле, мы будем * выполнять *. Смещение просто нормализует выполнение, поэтому его можно добавить в 'R0' как один или ноль. –

+0

+1 за попытку решить самую запутанную часть вопроса (которую я обошел вокруг ...) – Floris

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