寄存器和ascii字符的比较

时间:2014-01-11 16:46:03

标签: assembly compare ascii mips

在mips程序集中,如何比较寄存器(byte-i使用lb命令)的内容与基于ASCII表的字符?使用beq $ t0,45,L1是否正确,其中45为字符的十进制数

2 个答案:

答案 0 :(得分:2)

原则是正确的,但是如果存在语法错误,您可以将字符代码加载到寄存器中并比较寄存器:

li $t1, 45
beq $t0, $t1, L1

答案 1 :(得分:1)

我认为有一点可以帮助您忘记数据类型的任何概念。因为计算机并不聪明。

你问你是否可以将$ t0与小数值45进行比较 - 当然,你不能。 MIPS处理器对十进制值45一无所知。它只知道两个数字:1和0.幸运的是,十进制值45可以表示为一串1和0 - 0010 1101准确无误,8位。

然后,您想知道是否可以将$ t0与ASCII字符' - '进行比较。 MIPS处理器不再了解ASCII字符,也不了解十进制数字。幸运的是,ASCII standard没有说“这是一个破折号”。它表示字符' - '映射到位模式0010 1101,我们称之为十进制45.或十六进制0x2D - 但处理器也不知道有关十六进制的任何内容。

这是你真正幸运的地方。您不必在1和0中编写MIPS代码。你可以,但你不必 - 至少没有完成那个特定的家庭作业。 :)一些聪明的家伙写了一个叫做汇编程序的东西,它将你键入的字符(例如beq $t0, 45, L1)转换成一组或多组32位二进制数字。如果这些家伙真的很聪明,他们可能会确保Assembler知道45和0x2D是一样的,这也和ASCII字符' - '一样。

(但是......就像@Konrad说的那样,你不应该先通过像MARS这样的汇编程序运行代码吗?)

编辑:正如@Patrik所说,beq需要两个寄存器,而不是寄存器和立即数。所以你当然会得到beq $t0, 45, L1的语法错误。您首先需要将值45加载到另一个寄存器(可能是$ t8),然后加载beq $t0, $t8, L1