NIOS II Assembly, Как установить 2 разных переменных, используя одно местоположение регистра

61
4

То, что я пытаюсь выполнить, - установить десятичное значение для переменных A и B. Десятичное значение определяется на основе ввода, заданного внешним DIP-переключателем. DIP имеет 8 переключателей, и первые переключатели 1-4 должны контролировать переменную A, в то время как переключатели 5-8 управляют переменной B. Поэтому я понимаю, как установить значение регистра с использованием портов JP1 на моей плате DE0 NANO, но не знаю, как отделить значение десятичного десятичного знака до двух отдельных значений. Например, если я включаю переключатель 1 и 8, я получаю значение hexi 0xFFFFFF81, хранящееся в регистре. Если бы я хотел, чтобы A было десятичным значением 3 и B, также было бы 3, я бы сделал это "A [3: 0] <-DIP [1: 4] и C [3: 0] <-DIP [5: 8]".

Итак, суммируем то, что я сказал выше, как отделить значение hexi, хранящееся в регистре, на две переменные, где первые 4 переключателя управляют A и вторым 4-мя элементами управления B?

Ниже приведен код, который я до сих пор контролировал порты и светодиоды (используя светодиоды на плате, чтобы подтвердить, что swithces работают). Заранее спасибо.

.equ ANSWER, 0x00001000
.equ LEDS, 0x10000010
.equ JP1_PORTS, 0x10000060
.text
.global _start
_start: movia r2, ANSWER
movia r3, LEDS
movia r4, JP1_PORTS

loop: ldwio r5, 0(r4)
stwio r5, 0(r3)
br loop

DIP-переключатель

спросил(а) 2021-01-19T20:10:58+03:00 2 месяца, 3 недели назад
1
Решение
86

Я не знаю набора инструкций для NIOS II, но он почти наверняка имеет поразрядные и сдвиговые инструкции. Например, в C вы бы сделали:

int sw = read_switch(); //lower byte = bbbbaaaa
int a = sw & 0xF; //so now a= 0x0000aaaa
int b = sw >> 4; //b = xxxxbbbb, where x is whatever is in the upper bits.
//If you know the upper bits are always 0, you can stop here
b = b & 0xF //b = 0000bbbb

В чем-то вроде сборки ARM (опять же, не знаете NIOS, но она не должна быть слишком разной), это будет выглядеть так

ldr r0, [r5]      ; r5=pointer to switch register, so r0 = b'bbbbaaaa'
and r1, r0, #0xF ; r1 is your A switches
shr r2, r0, #4
and r2, r2, #0xF ; r2 is your B switches

ответил(а) 2021-01-19T20:10:58+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема