装配中的双重条件检查

时间:2011-03-04 16:28:08

标签: assembly x86

我正在开始组装,我正在使用nasm来组装代码, 我正在尝试处理驻留在内存中的字符串并进行更改, 我想检查一个字节是否在某个范围内(ascii)所以我可以决定如何处理它, 我似乎无法确定如何检查某个值是否在某个范围内,我知道这一切 不同类型的跳转标志,但我如何组合2个cmp语句?

我的问题是: 我如何在装配中产生类似的东西?

if (x>=20 && x<=100)
     do something

非常感谢!

4 个答案:

答案 0 :(得分:24)

一种只用一个条件跳转来表达范围检查的方法:

     sub  %eax,  20
     cmp  %eax,  80
     ja   END
     // do something
END: ret

使用整数范围时,这是一种非常常见的优化技巧。初始减法将范围[20,100]映射到[0,80];然后,使用单个无符号比较检查该范围内的成员资格。

另请注意,可以在C中执行相同的操作:

unsigned int upperBound = 100;
unsigned int lowerBound = 20;
if (yourValue - lowerBound <= upperBound - lowerBound) {
    // do something
}

答案 1 :(得分:6)

取决于您使用的语法,并假设x位于eax寄存器中,如下所示:

cmp  %eax, 20
jl   ELSE
cmp  %eax, 100
jg   ELSE
#do something
jmp  END

ELSE:
#do else

END:

答案 2 :(得分:1)

您可以尝试从更高级别的语言(C / C ++ / ...)进行编译,优化级别为高(-O3为gcc),并查看编译器生成的内容(objdump)。它应该生成非常有效的代码。

答案 3 :(得分:0)

喜欢那个?

x<20
if false jump to ELSE
x>100
if false jump to ELSE
  do something
  jump to ENDIF
:ELSE
  do something else
:ENDIF

或者你的意思是只使用一个汇编指令?