小编Pet*_*ter的帖子

汇编testq和cmovg指令

以下是做什么的?

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)

c x86 assembly x86-64 intel

1
推荐指数
1
解决办法
3455
查看次数

标签 统计

assembly ×1

c ×1

intel ×1

x86 ×1

x86-64 ×1