NIOS II 汇编,如何使用一个寄存器位置设置 2 个不同的变量
NIOS II Assembly, How to set 2 different variables using one register location
我想要完成的是为变量 A 和 B 设置十进制值。十进制值是根据外部 DIP 开关给出的输入确定的。 DIP 有 8 个开关,第一个开关 1-4 应该控制 A 变量,而开关 5-8 控制 B 变量。所以我知道如何使用我的 DE0 NANO 板上的 JP1 端口设置寄存器值,但不知道如何将十六进制寄存器值分成两个单独的值。例如,如果我打开开关 1 和 8,我会得到存储在寄存器中的十六进制值 0xFFFFFF81。如果我希望 A 为十进制值 3,而 B 也为 3,我会这样做 "A[3:0]<-DIP[1:4] and C[3:0]<-DIP[5:8]"。
所以总结一下我上面说的我如何将存储在寄存器中的hexi值分成两个变量,其中前4个开关控制A,第二个4个控制B?
下面是我目前控制端口和 LED 的代码(使用板载 LED 确认开关正在工作)。提前致谢。
.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 Switch
我不知道 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
我想要完成的是为变量 A 和 B 设置十进制值。十进制值是根据外部 DIP 开关给出的输入确定的。 DIP 有 8 个开关,第一个开关 1-4 应该控制 A 变量,而开关 5-8 控制 B 变量。所以我知道如何使用我的 DE0 NANO 板上的 JP1 端口设置寄存器值,但不知道如何将十六进制寄存器值分成两个单独的值。例如,如果我打开开关 1 和 8,我会得到存储在寄存器中的十六进制值 0xFFFFFF81。如果我希望 A 为十进制值 3,而 B 也为 3,我会这样做 "A[3:0]<-DIP[1:4] and C[3:0]<-DIP[5:8]"。
所以总结一下我上面说的我如何将存储在寄存器中的hexi值分成两个变量,其中前4个开关控制A,第二个4个控制B?
下面是我目前控制端口和 LED 的代码(使用板载 LED 确认开关正在工作)。提前致谢。
.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 Switch
我不知道 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