【问题标题】:Input validation and while loops assembly输入验证和while循环组装
【发布时间】:2020-11-17 18:16:50
【问题描述】:

那么,如何在汇编中编写以下内容:

do{
   //do something
}while (x<1000 || x>9999);

【问题讨论】:

  • 查看编译器输出,了解如何使用范围检查的无符号比较技巧实现该循环底部的示例 (addiu $t0, x, -1000 / sltiu $t0, $t0, 8999 / bne): godbolt.org.

标签: validation assembly input mips qtspim


【解决方案1】:

在汇编语言中,我们对控制结构使用“if-goto-label”样式(if-thenif-then-elseforwhiledo-while 等)。这种形式在汇编/机器代码中非常容易和自然——它被称为条件分支,所有处理器都有某种形式。 C 结构

if ( condition ) goto label;

对应于汇编语言中的条件分支。而C语言也只有简单的goto label;,没有周围的if,在汇编语言中称为无条件分支,所有处理器也都有它的某种形式。


对于 C 中的 do-while 循环,

...
do {
    .. do something ..
} while ( condition );
...

“if-goto-label”模式是:

    ...
Loop1:
    .. do something ..
    if ( condition ) goto Loop1;
    ...

在你的情况下,条件是析取的,任何一个条件都应该继续循环。

给定 condition1 || condition2 的 do-while 条件:

    ...
Loop1:
    .. do something ..
    if ( condition1 ) goto Loop1;
    if ( condition2 ) goto Loop1;
    ...

在上面,|| 是通过测试一个条件来处理的,然后是另一个。如果第一个条件为真,它会循环而不测试第二个条件。如果第一个条件为假,则继续测试第二个条件,然后判断是循环还是继续循环后的下一条语句。

这很容易翻译成汇编语言。所有处理器都提供某种条件分支,可能作为一条指令,也可能作为 2 条指令对,如比较和分支序列。条件分支或多或少直接用于实现任何一个 if-condition-goto 语句。

【讨论】:

  • 在这种情况下,可以将条件优化为一次范围检查。像double condition checking in assembly(x86 示例,但相同的逻辑适用于任何地方)
  • 还要注意,我们也可以将| 替换为||,这通常也是一个很好的优化。
  • 是的,尤其是在 MIPS 上,您经常需要将条件具体化为寄存器中的布尔变量。或者在 32 位 ARM 上,cmp / predicated-cmp 通常可以以零开销链接 2 个条件。
猜你喜欢
  • 2021-05-13
  • 2016-05-27
  • 2023-02-25
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
相关资源
最近更新 更多