x86-64 汇编 "cmovge" 到 C 代码
x86-64 Assembly "cmovge" to C code
虽然我不应该列出我给出的整个 4 行示例,(因为这是一个家庭作业问题)我很困惑应该如何阅读它并将其翻译成 C。
cmovge %edi, %eax
目前我的理解是该指令是当结果>=时的条件移动。它将函数的第一个参数 %edi
与整数寄存器 %eax
进行比较(在前一行汇编代码中为它分配了另一个参数值 %esi
)。但是,我不明白它的结果。
我的问题是解释优化代码。它不操作堆栈,我不确定如何用 C 编写它(或者至少我什至可以在编译时使用 gcc
开关来生成相同的结果)。
有人可以举几个小例子说明 cmovge
指令如何翻译成 C 代码吗?如果它作为自己的代码行没有意义,请随意弥补它。
这是通过虚拟化 Linux 操作系统 (CentOS 7) 在 x86-64 程序集中。
我可能会在这里为您提供完整的解决方案:
int
doit(int a, int b) {
return a >= b ? a : b;
}
gcc -O3 -masm=intel
变为:
doit:
.LFB0:
.cfi_startproc
cmp edi, esi
mov eax, esi
cmovge eax, edi
ret
.cfi_endproc
虽然我不应该列出我给出的整个 4 行示例,(因为这是一个家庭作业问题)我很困惑应该如何阅读它并将其翻译成 C。
cmovge %edi, %eax
目前我的理解是该指令是当结果>=时的条件移动。它将函数的第一个参数 %edi
与整数寄存器 %eax
进行比较(在前一行汇编代码中为它分配了另一个参数值 %esi
)。但是,我不明白它的结果。
我的问题是解释优化代码。它不操作堆栈,我不确定如何用 C 编写它(或者至少我什至可以在编译时使用 gcc
开关来生成相同的结果)。
有人可以举几个小例子说明 cmovge
指令如何翻译成 C 代码吗?如果它作为自己的代码行没有意义,请随意弥补它。
这是通过虚拟化 Linux 操作系统 (CentOS 7) 在 x86-64 程序集中。
我可能会在这里为您提供完整的解决方案:
int
doit(int a, int b) {
return a >= b ? a : b;
}
gcc -O3 -masm=intel
变为:
doit:
.LFB0:
.cfi_startproc
cmp edi, esi
mov eax, esi
cmovge eax, edi
ret
.cfi_endproc