装配中的双重条件检查

Mat*_*tan 5 x86 assembly

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

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

if (x>=20 && x<=100)
     do something
Run Code Online (Sandbox Code Playgroud)

非常感谢 !

Ste*_*non 24

还有就是要表达这样一个范围检查只使用一个单一的条件跳转的方式:

     sub  %eax,  20
     cmp  %eax,  80
     ja   END
     // do something
END: ret
Run Code Online (Sandbox Code Playgroud)

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

还要注意在C中可以做同样的事情:

unsigned int upperBound = 100;
unsigned int lowerBound = 20;
if (yourValue - lowerBound <= upperBound - lowerBound) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

  • 编译器知道这种优化,至少对于编译时常数范围(甚至对有符号范围使用无符号比较技巧)。当编译时未知边界时,他们无法安全地做到这一点,并且在某些情况下即使他们可以证明具有运行时变量范围的“upper&gt;lower”也无法做到这一点。https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69615。 (2认同)

And*_*all 6

根据您正在使用的语法,并假设xeax寄存器中,这样的事情:

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

ELSE:
#do else

END:
Run Code Online (Sandbox Code Playgroud)