assembly - 获取字节中特定位的值

标签 assembly binary mips

例如,我有这个二进制数:
00100101
我想用后2位和其他0来创建一个新数字,如下所示:
00000001

我正在使用MIPS,所以我假设我必须使用逻辑或,或,和等的某种组合,但到目前为止没有成功。

最佳答案

年代久远,但它是搜索结果中排名最高的网站。我认为详细解释原因不会有伤害。

标题下方的答案又快又脏

要获取特定的位,一种方法是通过“位掩码”。位掩码表示您只会让某些位通过。就像您遮罩某些要绘画的东西一样。

逻辑AND是我们想要的指令。逻辑运算比较各个位。它是任何数字化产品(如计算机)的中央操作。当您一路下滑时,所有芯片所要做的就是以新颖和创新的方式比较单个位。有2个运算和2个修饰符给出AND,OR,NOR,XOR,NAND,NOT,XNOR。

最后,我对逻辑比较器进行了总结。如果需要,请对其进行审查。
(in retrospect, I think this is the most valuable part for a newbie.)

但是,如果我们将某个设置为我们想要的东西,那么另一方面,也可以得到我们想要的东西。说我想要第2、3、4和7位。7- Y N N Y Y Y N N N-0正确。好吧,然后我创建一个带有1的蒙版。 1 0 0 1 1 1 0 0 0并进行逻辑与。

因此,这只是简单的数学运算。计算机说二进制。我只给它0 0 0 1 1 1 0 0对应的数字。

以二进制计数。最右边= 1,然后我们在每个位置加倍。我们也从0开始计数。因此右边的第0位= 1,第一个位是2,第3位= 4,然后是8、16、32、64、128。如果需要,请使用此编号,但请使用此编号您可以获得0到255之间的任何值。(或127到-128之间),但是负数更为复杂。可能是相关的。

重要的是要注意,计算机语言中有两种整数类型:有符号和无符号。最后一位-第7位(即您或我的第8位,价值128个无符号整数,但它等于有符号整数中的符号。令人惊讶的是,它们都具有相同的数字位数(或者也许考虑一下就不足为奇了)

例如,让给定的数字[0 0 0 1 1 1 0 0]并使第一位为1 {1 0 0 1 1 1 0 0}。如果这是一个无符号整数,则其值156(128 + 16+ 8+ 4),但是如果第七位是一个符号位-计算它有点复杂,您必须使用("Two's complement")来获得1001110的值。虽然它具有令人着迷的历史值得我们讨论,但此处并不适用。带符号位是通过翻转每个位来计算的-因为负数-0现在算作1,而1则算作0。因此,让我们使用{1 0 0 1 1 1 0 0}并将其设置为格式--{0 1 1 0 0 0 1 1},我们只需要记住它的负数即可。它的值翻转并加1:,然后我们必须记住减去-1 + (64) + (32) + (2) + (1) = 99(-)

我们减去一个是因为0000 0000为0。如果我们调用1111 1111 = 0,那么我们将有2个值等于0! (顺便说一句,这称为“补语”)。因此,第-1行中的下一个数字。我相信最好有两个关于恭维的讨论,这不在此讨论范围之内。

所以你说,
值AND 28 = newValue
那么你可以做到这一点。

或做一个FOR循环

for x in [0,1,2,4,8,16,32,64,-128]
    if (x AND value!= 0){
         y = log2(abs(x))
         print("the bit is a one in position" + y)
    } else {
        print("the bit is a 0 in position" + y)

    }


或者使用电源方面进行迭代以进行循环。

for(i = 1; i < 18, i++){
    byte y = 2 ** n
    if ((value & ubyte) == 0) { //is 0}


或以下基本相同的Java示例:

class BitDemo {
    public static void main(String[] args) {
        int bitmask = 0x000F;
        int val = 0x2222;
        // prints "2"
        System.out.println(val & bitmask);
    }
}


快速解答在这里

我的目标是针对所有编程语言更普遍地回答这个问题,因为这是一个有4年历史的问题。在组装时,您需要发挥更大的创造力。如您所知,自您提出要求以来,每个操作都必须是离散的。真的迫使您思考。

li $t1, 0x020    # get the sixth bit, HEX 20 = DEC 32  in binary = 0b0010 0000
and $t2, $a0, $t1  #t1 gets the bit
slt $t3, $zero, $t2  # compares zero < t2 and if true stores
                       #1 into t3, so stores the 6th bit in its own register. 


使用slt,它是一条op指令,所有其他比较器都是伪指令,效率较低。更优雅。

您还可以将前两个指令与psuedo指令结合使用
-99 - 1 = -100但是编译器只会在后台将其转换为以上内容。我想保存一个寄存器。

如果您知道要查找的位,则另一个选择是移至其位0。

**andi** $t2, $a0, 0x02

我不喜欢使用andi(和立即使用,但是我不记得为什么。过去我有一些奇怪的行为,但是解决上述问题的最短方法是:

 #your value = $a0
 andi $v0,  $a0,  0x01     #already in first bit, no more work
 andi $v1,  $a0,  0x02    
 slr  $v1,  $v1, 1         #since we have 1 bit in 2nd bit, just shift one


在您的情况下,您需要最后两位,所以我们做1 + 2(位值)=3。这就是上面的答案为0x03的地方。 0x告诉汇编程序其十六进制bc汇编程序仅真正喜欢十六进制。尽管如果好的(MARS)需要十进制3。

---逻辑比较器复习/介绍-
有人告诉我我是个聪明人。但是当我刚开始的时候,所有这些让我非常困惑,很难记住。直到我看了一会儿才意识到。
实际上非常简单。现在,我看着它,然后想,为什么这么难。比一年级的1 +1更容易。因此,如果您正在阅读此想法,那么这个人为什么要解释,这是因为您不记得第一次看到它了。

用这种方式思考,要记住两个选择,两个操作要容易得多,并且它们非常容易记住-AND和OR(或都不是逻辑比较)。他们不是对立的,他们是不同的,并且按照他们说的做。然后有2个修饰符。而已。以AND和OR为名,了解形容词非常容易。


我们谈论的第一个不是最简单的。它是一个修饰符,而不是一个运算符-它只需要一个值,因此它不是像OR或AND的逻辑比较器。相反。如果为1,则表示0。如果为0,则为1。相反,什么也没有。在电路中,它将是电线。没有什么改变。如果仅取1值,它是如何工作的,我认为它是后来的。您执行“或”或“与”操作,然后翻转它。所以AND和OR:


AND和OR很简单,


AND-如果两个都是1(1 AND 1),则值为1。这里没有别的。 1 AND 0为FALSE。 0和0为FALSE。仅当您参加工作并完成工作时,您才能获得报酬。 FALSE和FALSE在该语句中不起作用。
OR表示如果任一值为1,则值为1。就这样。把书拿回来或付我20美元,我不会打败你的。您可以做一个或另一个。如果两者都做怎么办?这很重要。好吧,您不会被殴打,因此1 OR 1的值为TRUE。如果您不带书或带20美元,则“不被殴打” = FALSE。
* X ***** [...]现在,OR的最后一部分是重要的部分。 1 OR 1 = 1位,您可以带$ 20或还书的情况。因此,让我们进行逻辑比较,看看什么是好主意。两者都做是愚蠢的。这就是X出现的地方-X代表eXclusive。说真的它消除了OR的一种特殊情况,即如果A或B为1,则OR为true。X说,不要使用1/1 = true选项,我只希望1值为true。这就是很多人感到困惑的地方,或者“至少一位为真”,“异或”表示恰好一位为真。所以现在1 XOR 1是(=)0。


就是这些,您将获得所有选择。


不是-它不是真正的比较器,只是将1个输入取反,但通常集总成
AND-两个比较值都是正确的,别无其他。
NAND-反向AND,因此如果两者均为true,则为false,其他所有条件均为true-(0,1)(0,0)(1,)。
或-至少一个为true(1,0)(1,1)(0,1)= True,只有(0,0)为false
NOR-反转OR,因此从上方开始,(1,0)(1,1)(0,1)= False,而(0,0)为true。
XOR-消除OR中的特殊情况(1,1)= true。 X仅适用于“或”,现在说正好为1。


XNOR-这将使您的头部受伤。但是,只需使用真值表逐步进行操作即可。我们以OR开头,并删除(1,1)= true,因此,当这些位匹配= false时,并且当它们不同时,则为true(1,0)(0,1)。然后将其反转。所以现在,当位不同(1,0)(0,1)时为假。但是当他们匹配时是真的。 (1,1)和(0,0),所以这是一个AND门,以及一个通过OR / XOR门相连的反向AND(NAND)门。 (X是无关紧要的,因为除非我们正在谈论量子问题,否则您不能使两个位同时为1,1和0,0。

关于assembly - 获取字节中特定位的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23299072/

相关文章:

exception - 系统调用和陷阱之间的区别

python - 在 python 中将二进制转换为十进制(没有内置二进制函数)

assembly - Mips:将一个变量存储在另一个变量中

C switch 语句的汇编 - 它是如何工作的?

c - 段错误 - 原因是什么

haskell - 覆盖 Word 中的最低有效位

vb.net - 在 VB.Net 中将位写入二进制文件

mips - 向 MIPS 添加新命令

assembly - MIPS中如何将负数变为正数?

assembly - FXTRACT 指令示例