Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 获取字节中特定位的值_Assembly_Binary_Mips - Fatal编程技术网

Assembly 获取字节中特定位的值

Assembly 获取字节中特定位的值,assembly,binary,mips,Assembly,Binary,Mips,例如,我有一个二进制数: 00100101 我想用最后2位和其他0来做一个新的数字,如下所示: 00000001 我正在使用MIPS,因此我假设我必须使用逻辑or、xor、and、ect的一些组合,但到目前为止还没有成功。您只需要按位and即可。这将返回字节中的前2位 在C中: int结果=值&0x03 例如,这将执行00100101&00000011,即00000001。执行此操作的MIPS指令是ANDI$t0,0x3旧的,但它是搜索结果的顶部,作为顶部命中。我认为详细解释一下原因不会有什么坏

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


我正在使用MIPS,因此我假设我必须使用逻辑or、xor、and、ect的一些组合,但到目前为止还没有成功。

您只需要按位and即可。这将返回字节中的前2位

在C中: int结果=值&0x03


例如,这将执行00100101&00000011,即00000001。

执行此操作的MIPS指令是
ANDI$t0,0x3
旧的,但它是搜索结果的顶部,作为顶部命中。我认为详细解释一下原因不会有什么坏处

在下面的标题后面快速而肮脏的回答 要获得特定的位,一种方法是使用“位掩码”。位掩码表示只允许某些位通过。就像当你遮住要画的东西

逻辑和是我们想要的指令。逻辑运算比较各个位。它是任何数字的中心操作——任何像计算机一样运行的东西。当你一路走低时,任何芯片所做的就是用新的和创造性的方式比较单个比特。有2个操作和2个修饰符给出and、OR、NOR、XOR、NAND、NOT、XNOR

最后,我对逻辑比较器进行了总结。如果需要,请检查它。
(回想起来,我认为这是新手最有价值的部分。)

但是,如果我们设定一个位是我们想要的,那么在另一边,我们就会得到我们想要的。假设我想要第2、3、4和7位。7-Y-N-Y-N-0对。那么,我创建了一个有1的面具。1 0 0 1 1 0 0并执行逻辑and

所以这只是简单的数学。这台计算机讲二进制语言。我只给它0 0 1 1 0 0对应的数字

二进制计数。最右边=1,然后我们在每个位置加倍。我们也从0开始计数。所以右边的第0位=1,第一位是2,第三位=4,然后是8,16,32,64,128。如果你想玩这个,但是使用这个数字你可以得到0到255之间的任何值。(或127到-128)但否定的情况更复杂。不过这可能是相关的

需要注意的是,在计算机语言中有两种类型的整数-有符号的,和无符号的。最后一位-第7位(即你或我的第8位,值128个无符号整数,但它正好等于有符号整数中的符号。令人惊讶的是,它们的位数相同(或者,如果你仔细想想,可能并不奇怪)

例如,让我们以给定的数字
[0 0 0 0 1 1 0 0]
为例,将第一位设为1
{1 0 0 1 1 0}
,如果这是一个无符号整数,则其值为156(
128+16+8+4)
,但如果第七位是符号位,则计算起来有点复杂。必须使用()得到1001110的值。虽然它有一段引人入胜的历史值得讨论,但这里没有。有符号位是通过翻转每个位来计算的-因为在负数中-0现在算作1,1是0。所以让我们把
{1 0 0 1 1 0 0}
作为一种格式,用于-
{0 1 0 0 1}
,我们只需要记住它的负数。它的值,翻转并加1:
-1+(64)+(32)+(2)+(1)=99(-)
,然后我们必须记住减去
-99-1=-100

我们减去1是因为0000 0000是0。如果我们调用1111111=0,那么0将有2个值!(顺便说一句,这称为一的补码)。因此,行中的下一个数字--1!。我确信有更好的二的补码讨论,并且它超出了本文的范围

所以你说,, 值和28=新值 那你就可以了

或者做一个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)

    }
或者使用power方面进行for循环以进行迭代

for(i = 1; i < 18, i++){
    byte y = 2 ** n
    if ((value & ubyte) == 0) { //is 0}
快速回答就在这里 我的目的是更一般地回答所有编程语言的问题,因为这是一个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. 
在你的例子中,你想要最后两位,所以我们做1+2(位值)=3。这就是上面的答案得到0x03的地方。0x告诉汇编程序它的十六进制bc,汇编程序只喜欢十六进制。虽然如果它好(MARS),就需要十进制3

---逻辑比较器回顾/介绍--- 有人告诉我,我是一个聪明人。但当我刚开始的时候,所有这些都让我很困惑,很难记住。直到我看了一会儿才意识到一些事情。
这其实很简单。现在我看着它,想,为什么这么难。这比一年级的1+1容易。所以,如果你在读这篇文章,你会想为什么这个家伙在解释,因为你不记得第一次看到它的时候

这样想就容易多了,因为只有两种选择,两种操作要记住,而且它们非常容易记住-和或(或两者都没有)用于逻辑比较。它们不是对立的,它们是不同的,它们会按照它们说的做。然后有两个修饰语。就是这样。理解和或在名称中,知道形容词非常容易

  • 不是我们谈论的第一个是最简单的。它是一个修饰符,而不是一个运算符-它只接受一个值,因此它不是像或和那样的逻辑比较器。它只是做相反的事情。如果它是1,它表示0。如果它是0,那么它是1。它的对立面是零。在电路中,它将是一根线。没有变化。它是什么如果它只取1个值,它就工作了,我认为它在后面。你做OR AND运算,然后翻转它。所以AND OR:
和或很简单

  • -如果两个值都是1(1和1),则值为1。此处其他值均为true。1和0为FALSE
    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. 
    
     #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