我正在开始组装,我正在使用nasm来组装代码, 我正在尝试处理驻留在内存中的字符串并进行更改, 我想检查一个字节是否在某个范围内(ascii)所以我可以决定如何处理它, 我似乎无法确定如何检查某个值是否在某个范围内,我知道这一切 不同类型的跳转标志,但我如何组合2个cmp语句?
我的问题是: 我如何在装配中产生类似的东西?
if (x>=20 && x<=100)
do something
非常感谢!
答案 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
或者你的意思是只使用一个汇编指令?