ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

cmov用法一例

cmov用法一例
#include <stdio.h>/* sub_and_abs */
int sna(int, int);int main() {printf("%d %d\n", sna(1,3), sna(9,5));
/* 2 4 */
/* 64位下sizeof(int)=4 */ }
.text.globl sna.type  sna, @function
sna:push %rbxmov %edi, %eaxmov %esi, %ebxcmp %eax, %ebxcmovg %esi, %eaxcmovg %edi, %ebxsub %ebx, %eaxpop %rbxret
.section .note.GNU-stack,"",@progbits

编译:gcc main.c sna.s (no error, no warning). BTW: warning: 提醒; 警告。提醒在警告前面,然而翻译者选了后者。

必须保存和恢复ebx,因为main里用了它(保存sna的返回值):

movl    $5, %esi
movl    $9, %edi
call    sna@PLT
movl    %eax, %ebx

main先调用sna(9,5)后调用sna(1,3)。我记得这个顺序是未指定的。一味纯函数式编程,或者说不爱用临时变量这种有过程式编程痕迹的东西,可能会大吃一惊。比如做个象棋或其它游戏,画和擦的顺序有时是有讲究的。

返回列表