首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NIOS II程序集,如何使用一个寄存器位置设置2个不同的变量

NIOS II程序集,如何使用一个寄存器位置设置2个不同的变量
EN

Stack Overflow用户
提问于 2018-02-15 03:27:04
回答 1查看 515关注 0票数 1

我试图完成的是将一个十进制值设置为变量A和B。十进制值是根据外部DIP开关提供的输入来确定的。DIP有8个开关,第一个开关1-4控制A变量,而开关5-8控制B变量。因此,我理解如何使用我的JP1纳米板上的DE0端口设置寄存器值,但不知道如何将十六进制十进制寄存器值分离为两个单独的值。例如,如果我打开开关1和8,就会得到存储在寄存器中的十六进制值0xFFFFFF81。如果我希望A是小数值3,B也是3,我会这样做“A3:0<-DIP5 1:4和C3:0<-DIP5 5:8”。

综上所述,我如何将存储在寄存器中的十六进制值分成两个变量,其中前4个开关控制A,第二个4个控制B?

下面是我到目前为止控制端口和LED的代码(使用车载LED来确认swithces正在工作)。提前谢谢。

代码语言:javascript
复制
.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

倾角开关

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-15 03:49:13

我不知道NIOS II的指令集,但是它几乎肯定有位指令和移位指令。例如,在C语言中,您可以这样做:

代码语言:javascript
复制
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,但它不应该太不同),它将如下所示

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48799542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档