首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mips64上设置MMIO寄存器的63位的最佳方法

在mips64上设置MMIO寄存器的63位的最佳方法
EN

Stack Overflow用户
提问于 2013-09-28 20:06:40
回答 1查看 193关注 0票数 1

我需要用MIPS汇编语言设置64位MMIO寄存器的63位(MSB)。

目前我正在做这件事

代码语言:javascript
复制
ldi $2,0x8000000000123456 #This is the address of the register which i want to set 63 rd bit 
ld $3,0($2) # read current value from the register 
dli $4,0x8000000000000000  # set 63rd bit as 1 and load in to register $4
dadd $4,$3,$4    # add mask value and current value to set 63rd bit 
sd $4,0($2)

但这是非常冗长的代码。我想以最优化的方式来做。还有没有别的办法呢?

EN

回答 1

Stack Overflow用户

发布于 2014-06-15 12:13:38

你的程序错了。从技术上讲,它是这样做的

代码语言:javascript
复制
uint64_t p = *((uint64_t*)0x8000000000123456ULL);
p += 0x8000000000000000ULL;

它实际上切换最高位,如果值设置了最高位,则不会给出正确的值。实际上,由于这是dadd而不是daddu,因此如果设置了顶部比特,它将陷入陷阱

你应该阅读更多关于bitwise operations的内容:To a bit, use and; use or to and xor to a bit

在MIPS中,您可以这样做

代码语言:javascript
复制
ldi  $2, 0x8000000000123456
ld   $3, 0($2)
lui  $4, 0x8000 # $4 = 0x80000000
dsll $4, $4, 32 # $4 = 0x8000000000000000
or   $4, $3, $4
sd   $3, 0($2)

lui/dsll对用于加载立即数组。它可以被任何等价的序列替换,这些序列将2的幂加载到低半部,然后将其移位到高半部

请注意,除非你使用的是MMIO,否则没有所谓的“寄存器地址”。它是包含指向内存位置的地址的寄存器。如果您正在访问实际内存或允许部分寄存器访问的MMIO设备,那么您有一个替代的解决方案,只需加载特定的字节、半字或字并对其进行编辑,这将为您节省加载64位立即数组的几条指令

代码语言:javascript
复制
# byte
ldi $2, 0x8000000000123456 # assume big endian
lbu $3, 0($2)
ori $3, 0x80
sb  $3, 0($2)

# halfword
ldi $2, 0x8000000000123456
lhu $3, 0($2)
ori $3, 0x8000
sh  $3, 0($2)

# word
ldi $2, 0x8000000000123456
lbu $3, 0($2)
lui $4, 0x8000
or  $3, $4, $3
sd  $3, 0($2)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19066766

复制
相关文章

相似问题

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