因为 −x = not(x)+1 意味着 a-b = a+not(b)+1,那么
sub rax, rcx
相当于
mov temp, rcx
not temp
add rax, temp
add rax, 1
其中 temp 是一些被认为是易失性的寄存器?
换句话说,后者是否以完全相同的方式影响 EFLAGS?如果不是,又怎么能强迫呢?
不,它们并不等同。例如如果rax = 1
and rcx = 3
, then sub rax, rcx
将设置进位标志,因为您正在从较小的数字中减去较大的数字。但在你的第二个指令序列中,遵循add rax, temp
, rax
将包含-3
(i.e. 0xfffffffffffffffd
),并添加1
to -3
不会引起进位。因此,在第二个指令序列之后,进位标志将被清除。
我不知道有什么简单的方法可以准确模拟sub
包括它对标志的影响(除了使用cmp
,但那是作弊,因为它真的只是sub
在引擎盖下)。原则上,您可以编写一长串指令来手动执行所有相同的测试sub
在内部执行(参考指令集手册中的精确描述),并在末尾使用设置标志sahf
or popf
之类的。
这将是一项繁重的工作,特别是如果您不打算使用cmp
,我不会为了这个答案而详细介绍它。特别是因为我也想不出任何需要这样做的原因,除了作为一项相当毫无意义的练习。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)