当前位置: 首页 > 知识库问答 >
问题:

在mips64上设置MMIO寄存器第63位的最优化方法

轩辕经赋
2023-03-14

目前我正在做这个

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)

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

共有1个答案

范峰
2023-03-14

你的程序错了。它在技术上是这样做的

uint64_t p = *((uint64_t*)0x8000000000123456ULL);
p += 0x8000000000000000ULL;

它实际上切换了顶部位,如果值设置了顶部位,则不会给出正确的值。实际上,如果设置了top位,它就会陷阱,因为这是dadd而不是daddu

您应该更多地了解按位操作:要清除一个位,请使用;使用设置和XOR切换位

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)
# 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)
 类似资料:
  • 基本上指令有8->16、8->32、8->64、16->32和16->64。 32->64的转换在哪里?我必须使用签名版本吗? 如果是的话,您如何使用完整的64位来表示无符号整数?

  • 本文向大家介绍verilog 移位寄存器,包括了verilog 移位寄存器的使用技巧和注意事项,需要的朋友参考一下 示例 具有异步复位功能的N位深移位寄存器。            

  • 要清除所有位,您通常会在中看到一个独占或。反面也有这样的把戏吗? 我所能想到的就是用一个额外的指令来反转零。

  • 在8位寄存器中添加5到0FBh设置零标志 我是新来的,所以如果你是专家,请对我耐心。下面是我如何分解它的,但我显然做错了什么。也许我对零标志的理解是错误的? 在我的理解中,如果结果为0.0FB=251,则设置零标志;251 5 = 256; 二进制:0000000 100000000十六进制:100 这不是0,那么为什么设置零标志?

  • 以下所有指令都执行相同的操作:将设置为零。哪种方式是最优的(需要最少的机器周期)?

  • 我正在使用x86 Assembly,我遇到了使用指令的需要。 我的代码片段过去是这样的: 其中<代码> 所以我的程序正在命中未定义的行为,在这种情况下是一个无限循环,在检查了很长时间可能出错的地方之后,我认为我必须使用,因为 实际上将结果存储在< code>ax中。因此,我在< code>ax中有一个有符号的结果,而我希望在< code>al中有一个无符号的(有上溢/下溢)结果。 所以我的问题是: