【问题标题】:how can you translate the statement if(isalpha(c)) from C++ to MIPS? [closed]如何将语句 if(isalpha(c)) 从 C++ 转换为 MIPS? [关闭]
【发布时间】:2013-04-14 03:54:14
【问题描述】:

我正在尝试将语句if(isalpha(c))(其中c 是一个字符变量)从C++ 转换为MIPS 程序集。我试图用谷歌搜索它,但我找不到答案。有人有什么主意吗?感谢您的宝贵时间。

【问题讨论】:

  • 程序员应该发现非常宝贵的技能是编程或至少尝试的能力。我对编程行业感到绝望,在这个行业中,每个人都试图从谷歌上喜欢的 sn-ps 构建他们的应用程序。
  • @paxdiablo——我还在谷歌上找到其他学校/教授的教程。如果我认为我的笔记不完整,这就是我首先要做的。当我说“我用谷歌搜索”时,并不一定意味着我正在寻找其他人编写的代码,否则,我不需要来 stackoverflow.com,因为它也在 google 上找到了所有可能的代码答案.感谢您的宝贵时间!
  • 你有什么问题;你不知道isalpha() 做什么或者你不知道MIPS 汇编?或者两者都不是?还是两者兼而有之?
  • 我们已经介绍了 MIPS 中的 if 语句和函数。我的问题是试图翻译条件是“函数 isalpha(c) 的返回”的“if”语句。我不确定我是否接近答案,但我正在考虑执行以下操作:$v0=isalpha(c),然后将 $v0 与数字的 Ascii 代码范围进行比较。
  • isalpha 使用字符特征查找表,您需要复制它以获得完全相同的功能。如果您只关心罗马字符 AZ,您可以通过测试 c 的值轻松做到这一点(例如 if (c >= 'a' and c = 'A' and c

标签: c++ function mips translate


【解决方案1】:

我只是要演示一种可能的方法,它并不高效或“酷”,但它很简单。

所以,你想要这个 C 块的等价物:

if (isalpha(c))
{
    /* Do stuff... */
}

这是这样的,考虑到isalpha() 的工作原理:

if (('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z'))
{
    /* Do stuff... */
}

但是汇编中没有“块”结构。一切都是跳转(或 C 中的 goto,你应该永远使用它。)因此,为了更接近汇编版本,我们可能会修改我们的 C 代码使用跳跃:

if (!(('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z')))
    goto AfterStuff;

/* Do stuff... */

AfterStuff:

请注意,如果我们的条件 reverse 为真,我们将跳过“做事”部分。 现在,假设我们知道'A' 'Z' 'a' 'z'(ASCII码分别为:65、90、97、122),那么我们可以这样重写上面的代码:

if (c < 65)
    goto AfterStuff;
if (c <= 90)
    goto DoStuff;
if (c < 97)
    goto AfterStuff;
if (c > 122)
    goto AfterStuff;

DoStuff:
/* Do stuff... */

AfterStuff:

请注意,如果c 小于'A',我们会跳到这些东西后面。但是如果比较c和'A'后发现c不仅大于等于'A'(因为我们没有跳开)而且小于等于'Z',我们直接跳到“东西”,不要检查其他任何东西。另外,最后一条blt 指令的操作数是相反的。

程序集有点复杂,因为我们必须将所需的立即数加载到寄存器中等等。代码如下:

  lb    $t0, ($s0)            # assuming address of c is in s0 register

  addi  $t1, $zero, 65        # set t1 = 'A'
  blt   $t0, $t1, AfterStuff  # if (c < 'A') goto AfterStuff

  addi  $t1, $zero, 90        # set t1 = 'Z'
  ble   $t0, $t1, DoStuff     # if (c <= 'Z') goto DoStuff

  addi  $t1, $zero, 97        # set t1 = 'a'
  blt   $t0, $t1, AfterStuff  # if (c < 'a') goto AfterStuff

  addi  $t1, $zero, 122       # set t1 = 'z'
  blt   $t1, $t0, AfterStuff  # if ('z' < c) goto AfterStuff

DoStuff:
  # Do whatever you want to do

AfterStuff:

我相信上述方法可行,但我绝对不能确定。自从我编写任何 MIPS 汇编代码(或任何其他 MIPS 代码)以来已经十多年了,而且我从来都不是很精通。

【讨论】:

    猜你喜欢
    • 2018-07-12
    • 2012-05-06
    • 1970-01-01
    • 2022-09-30
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多