MIPS汇编中是否支持二进制常量?有无类似0x的标识前缀?
MIPS汇编常量相关问题解答
嘿,针对你的两个MIPS汇编相关问题,我来逐一给你唠清楚:
问题1:MIPS汇编中能否用二进制数替代十进制常量?
当然可以,但这得看你用的是哪种汇编器或者模拟器——不同工具对二进制常量的支持规则不太一样:
- 如果你用的是GNU汇编器(GAS):完全没问题,它支持直接用二进制常量代替十进制。
- 要是你用的是MARS、SPIM这类教学常用的模拟器:也能间接用,只是不能直接在
li这类指令里裸写二进制数,具体方法后面会细说。
问题2:有没有类似0x的二进制标识前缀?为啥用0b会出错?
首先得明确:没有所有MIPS汇编器都统一支持的二进制前缀,不同工具的规则差异很大:
- 如果你用的是GNU汇编器(GAS):
0b或者0B就是合法的二进制前缀,比如写li $t0, 0b10001,汇编器会正确把它解析成二进制的17,不会当成十进制的10001。 - 但如果你用的是MARS、SPIM这类教学模拟器:它们通常不支持在
li指令里直接用0b前缀,这就是你出错的原因。不过别担心,有几个替代方案能用:- 转成十六进制:二进制
10001对应的十六进制是0x11,直接写li $t0, 0x11就行,所有MIPS汇编器都认十六进制前缀0x。 - 直接用转换后的十进制:既然二进制
10001是十进制的17,那直接写li $t0, 17也很简单。 - 先定义再加载:在
.data段先定义二进制常量,比如binary_num: .word 0b10001,然后在.text段用lw $t0, binary_num来加载,这种方式在MARS里是可行的。
- 转成十六进制:二进制
另外要注意:如果直接写li $t0, 10001,不管哪个汇编器都会把它当成十进制的10001,因为没有前缀的数字默认就是十进制常量,这点是所有工具都统一的。
内容的提问来源于stack exchange,提问作者Wodune
相关产品推荐
相关产品推荐

