目前我正在做这个
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)
但这是非常冗长的代码。我想以最优化的方式做这件事。还有别的办法做吗?
你的程序错了。它在技术上是这样做的
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中有一个无符号的(有上溢/下溢)结果。 所以我的问题是: