我需要用MIPS汇编语言设置64位MMIO寄存器的63位(MSB)。
目前我正在做这件事
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)但这是非常冗长的代码。我想以最优化的方式来做。还有没有别的办法呢?
发布于 2014-06-15 12:13:38
你的程序错了。从技术上讲,它是这样做的
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中,您可以这样做
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位立即数组的几条指令
# 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)https://stackoverflow.com/questions/19066766
复制相似问题