在mips汇编中,如何将寄存器(byte-i使用了lb命令)的内容与基于ASCII表的字符进行比较?使用beq$t0,45,L1正确吗?其中45是字符的十进制数
原理是正确的,但如果出现语法错误,您可以在寄存器中加载字符代码并比较寄存器:
li $t1, 45
beq $t0, $t1, L1
我认为有一件事会有所帮助,那就是忘记数据类型的任何概念。因为电脑没有那么智能。
您在问是否可以将$t0与十进制值45进行比较——当然,您不能。MIPS处理器对十进制值45一无所知。它只知道两个数字:1和0。幸运的是,十进制值45可以用8位表示为一组1和0——确切地说是0010 1101
。
然后,您想知道是否可以将$t0与ASCII字符"-"进行比较。MIPS处理器对ASCII字符的了解并不比对十进制数字的了解更多。幸运的是,ASCII标准没有说"这是一个破折号"。它说字符"-"映射到位模式0010 1101
,我们知道它是十进制45。或者十六进制0x2D,但处理器对十六进制也一无所知。
这是你真正幸运的地方。您不必在1和0中编写MIPS代码。你可以,但你不必——至少一旦你完成了那项特定的家庭作业。:)一些聪明的家伙写了一种叫做汇编程序的东西,可以把你键入的字符(如beq $t0, 45, L1
)转换成一组或多组32位二进制数字。如果这些家伙真的很聪明,他们可能会确保汇编程序知道45与0x2D是一回事,这与ASCII字符"-"也是一回事。
(但是,是的……就像@Konrad所说的,你不应该先通过MARS这样的汇编程序运行代码吗?)
编辑:正如@Patrik所指出的,beq
采用两个寄存器,而不是一个寄存器和一个立即数。因此,beq $t0, 45, L1
当然会出现语法错误。您首先需要将值45加载到另一个寄存器(可能$t8),然后再加载beq $t0, $t8, L1
。