以下是做什么的?
testq %rdx, %rdx
cmovg %rcx, %rax
Run Code Online (Sandbox Code Playgroud)
我知道testq是两个寄存器之间的按位,但它如何与标志一起工作?这将在c中转化为什么?例如,如果%rdx
将持有价值0x01
,那么我们就会有0x01
&0x01
= 0x01
,这将设置
ZF = 0, SF = 0, OF = 0.
Run Code Online (Sandbox Code Playgroud)
而且,如果我能找到cmovg
˜(SF ˆ OF) & ˜ZF
Run Code Online (Sandbox Code Playgroud)
哪个会解决
˜(0 ˆ 0) & ˜0 = ˜(0) & ˜0 = 1 & 1 = 1.
Run Code Online (Sandbox Code Playgroud)
这是否意味着将执行cmovg并且相应的c代码将表现为d = %rdx
,a = rax
并且c = rcx
:
if(d > 0){
a = c;
}
Run Code Online (Sandbox Code Playgroud)
或者有人可以换句话说这个吗?
另外,我一直在尝试使用这个程序集将其转换为相应的c代码.目前我得到的结果最终像testq%rdx上的无限while循环,%rdx与jne .L4.随着上面的内容被封闭.谁知道正确的解决方案是什么?我目前的解决方案是:
p:
movq (%rdi), %rdx
testq %rdx, %rdx
je …
Run Code Online (Sandbox Code Playgroud)