Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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 Mips组件beq和_Assembly_Mips - Fatal编程技术网

Assembly Mips组件beq和

Assembly Mips组件beq和,assembly,mips,Assembly,Mips,我有一个关于Mips条件语句的问题。我可以在beq中使用and运算符吗?例如,在C语言中,我可以写if(arr[0]='a'&&arr[1]='b'&&arr[2]='C'),但我如何在mips汇编中编写这样的代码呢?基本上,我们将控制流与测试条件的逻辑结合起来。正如@Jester告诉您的,我们可以在C中完成/观察这一点,对于这些转换,C通常比汇编更友好 您可以看到: if(arr[0]='a'和&arr[1]='b'和&arr[2]='c'){…} 相当于: if (arr[0]=='a')

我有一个关于Mips条件语句的问题。我可以在beq中使用and运算符吗?例如,在C语言中,我可以写if(arr[0]='a'&&arr[1]='b'&&arr[2]='C'),但我如何在mips汇编中编写这样的代码呢?

基本上,我们将控制流与测试条件的逻辑结合起来。正如@Jester告诉您的,我们可以在C中完成/观察这一点,对于这些转换,C通常比汇编更友好

您可以看到:
if(arr[0]='a'和&arr[1]='b'和&arr[2]='c'){…}

相当于:

if (arr[0]=='a') {
    if (arr[1] == 'b') {
        if (arr[2] == 'c') {
            ...
        }
    }
}
所以,如果你知道如何做
if(x==y){…}
,那么只需应用三次


在汇编语言中,我们唯一的决策控制流构造是“if goto”,当然,只能测试简单的条件

因此,为了执行
if(x==y){then part}else{else part}
,使用“if goto”样式,我们测试
x==y
,如果该条件为false,我们将围绕
然后part
进行分支,并转到
else部分
。由于我们在条件false上进行分支,因此当条件为true时,我们无法进行分支并在条件测试之后立即运行我们编写的
then部分

由于我们在条件false上进行分支,因此出于所有实际目的,我们使用C中的“if goto”样式编写:
if(x!=y)goto ElseLabel之后是
然后是部分
翻译


有关参考,请参见以下帖子:


从根本上说,我们将控制流与测试条件的逻辑结合起来。正如@Jester告诉您的,我们可以在C中完成/观察这一点,对于这些转换,C通常比汇编更友好

您可以看到:
if(arr[0]='a'和&arr[1]='b'和&arr[2]='c'){…}

相当于:

if (arr[0]=='a') {
    if (arr[1] == 'b') {
        if (arr[2] == 'c') {
            ...
        }
    }
}
所以,如果你知道如何做
if(x==y){…}
,那么只需应用三次


在汇编语言中,我们唯一的决策控制流构造是“if goto”,当然,只能测试简单的条件

因此,为了执行
if(x==y){then part}else{else part}
,使用“if goto”样式,我们测试
x==y
,如果该条件为false,我们将围绕
然后part
进行分支,并转到
else部分
。由于我们在条件false上进行分支,因此当条件为true时,我们无法进行分支并在条件测试之后立即运行我们编写的
then部分

由于我们在条件false上进行分支,因此出于所有实际目的,我们使用C中的“if goto”样式编写:
if(x!=y)goto ElseLabel之后是
然后是部分
翻译


有关参考,请参见以下帖子:


否,
beq
获取2个寄存器并比较它们,仅此而已。请记住,汇编语言反映了机器代码在一条指令中所能做的事情。做更复杂的事情通常需要更多的指导

要同时使用多个条件,您需要

  • 多条
    beq
    和/或
    bne
    指令;一串树枝

  • 或者在一个寄存器中创建一个值,该值表示分支前多个条件的逻辑和。例如,分别用
    'a'
    'b'
    'c'
    加载所有3个字节和
    xori
    。(为匹配生成
    0
    )。然后将
    这些结果放在一起,查看最终结果是否为
    0
    (使用
    bne
    beq
    $zero
    )如果是,则3个字节中的任何字节都没有不匹配的位,因此该条件为真

第二种方法优化了C逻辑的短路评估。请注意,在C表达式中,如果
a[0]!='一个“
,因此即使
a
是指向页面最后一个字节的指针,并且下一个页面未映射,它也不会出错。(假设
a[0]==0
或什么,一个以0结尾的空字符串)

但是,如果您确实知道可以安全地访问字符串/数组的所有3个字节,那么这是一个选项

当条件类似于
if(x<5&&y<10)
时,作为优化更容易/更有效,您可以使用2x
slti
指令实现该优化,将寄存器与这些寄存器进行比较,然后
beq$t0,$零,跳过if\u body


在检查3个连续字节的特殊情况下,基本上是
memcmp(a,“abc”,3)

如果您知道
a
是字对齐的,您可以执行字加载以获得所需的3个字节,再加上我们需要忽略的1个字节的垃圾

MARS模拟了一个小小的endian MIPS系统,所以我们想要的3个字节是单词中最不重要的3个字节。(通常,MIPS可以运行为大尾端或小尾端。)

#假设[]是一个字对齐的静态数组
#和小端点MIPS
lw$t0,用于lui/lw构造完整地址的伪指令

li$t1,'abc'No,
beq
获取2个寄存器并对它们进行比较,仅此而已。请记住,汇编语言反映了机器代码在一条指令中所能做的事情。做更复杂的事情通常需要更多的指导

要同时使用多个条件,您需要

  • 多条
    beq
    和/或
    bne
    指令;一串树枝

  • 或者在一个寄存器中创建一个值,该值表示分支前多个条件的逻辑和。例如,分别用
    'a'
    'b'
    'c'
    加载所有3个字节和
    xori
    。(为匹配生成
    0
    )。然后
    o