【问题标题】:Comparison between register and ascii character寄存器和ascii字符的比较
【发布时间】:2014-01-30 15:31:43
【问题描述】:

在 mips 汇编中,如何将寄存器的内容(字节-我使用 lb 命令)与基于 ASCII 表的字符进行比较?使用 beq $t0,45,L1 是否正确,其中 45 是字符的十进制数

【问题讨论】:

  • 任何体面的汇编程序都允许你写beq $t0,'-',L1
  • 万一我们不能使用''?我的意思是我们如何与数字进行比较
  • 然后在 ascii 表中查找。
  • 我们使用的汇编器没有汇编它 - 语法错误这就是我问的原因!

标签: assembly compare ascii mips


【解决方案1】:

原理是对的,但是如果出现语法错误,可以将字符码加载到寄存器中,比较寄存器:

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

【讨论】:

    【解决方案2】:

    我认为会有所帮助的一件事是让您忘记任何数据类型的概念。因为电脑没那么聪明。

    您是在问是否可以将 $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位二进制数字。如果这些家伙真的很聪明,他们可能会确保汇编器知道 45 与 0x2D 相同,这与 ASCII 字符“-”也相同。

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

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

    【讨论】:

    • 首先感谢您的回答。其次,我们使用的汇编器在命令中发现语法错误: $t0,45,L1 , $t0,'-',L1 , $t0,00101101,L1
    • @user3185493 看看@Patrik 的回答。我应该记得,beq 需要两个 register 操作数,而不是寄存器和立即数。所以你需要将你的校验值加载到一个寄存器中,然后进行比较。
    猜你喜欢
    • 2014-09-17
    • 1970-01-01
    • 2014-04-04
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多