因为a+not x= not(x)+1,这就意味着a-b =−(B)+1,所以
sub rax, rcx相等于
mov temp, rcx
not temp
add rax, temp
add rax, 1哪些寄存器被认为是不稳定的?
换句话说,后者是否以完全相同的方式影响EFLAGS?如果没有,又怎能强迫呢?
发布于 2020-06-05 16:03:03
不,他们不一样。例如,如果是rax = 1和rcx = 3,那么sub rax, rcx将设置进位标志,因为您要从较小的数字中减去更大的数字。但是在您的第二个指令序列中,在add rax, temp之后,rax将包含-3 (即0xfffffffffffffffd),并且将1添加到-3并不会导致进位。所以在你的第二个指令序列之后,进位标志就会被清除。
我不知道有什么简单的方法可以准确地模拟sub的行为,包括它对标志的影响(除了使用cmp,但这是欺骗,因为它实际上只是隐藏的sub )。原则上,您可以编写一长串指令,手动执行与sub在内部执行的所有相同的测试(参考指令集手册中的精确描述),并使用类似的sahf或popf在末尾设置标志。
这将是很多工作,特别是如果您不打算使用cmp,而我不打算通过它来回答这个问题。特别是因为我也想不出为什么一个人需要这样做,除了作为一个相当没有意义的练习。
https://stackoverflow.com/questions/62218921
复制相似问题