Assembly Mips组件beq和
我有一个关于Mips条件语句的问题。我可以在beq中使用and运算符吗?例如,在C语言中,我可以写if(arr[0]='a'&&arr[1]='b'&&arr[2]='C'),但我如何在mips汇编中编写这样的代码呢?基本上,我们将控制流与测试条件的逻辑结合起来。正如@Jester告诉您的,我们可以在C中完成/观察这一点,对于这些转换,C通常比汇编更友好 您可以看到: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')
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)
时,作为优化更容易/更有效,您可以使用2xslti
指令实现该优化,将寄存器与这些寄存器进行比较,然后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