我正在开始组装,我正在使用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)
根据您正在使用的语法,并假设x在eax寄存器中,这样的事情:
cmp %eax, 20
jl ELSE
cmp %eax, 100
jg ELSE
#do something
jmp END
ELSE:
#do else
END:
Run Code Online (Sandbox Code Playgroud)