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 %rbx
 mov %edi, %eax
 mov %esi, %ebx
 cmp %eax, %ebx
 cmovg %esi, %eax
 cmovg %edi, %ebx
 sub %ebx, %eax
 pop %rbx
 ret
.section .note.GNU-stack,"",@progbits

编译:gcc main.c sna.s (0 error, 0 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)。我记得这个顺序是未指定的。一味纯函数式编程,或者说不爱用临时变量这种有过程式编程痕迹的东西,可能会大吃一惊。比如做个象棋或其它游戏,画和擦的顺序有时是有讲究的。

一时觉得ax放a,bx放b好。

Functions preserve the registers rbx, rsp, rbp, r12, r13, r14, and r15; while rax, rdi, rsi, rdx, rcx, r8, r9, r10, r11 are scratch registers. (https://wiki.osdev.org/System_V_ABI#x86-64)

常见的调用约定如下:(https://www.cnblogs.com/tiny1987/p/14850909.html)

  • cdecl (C declaration): 32位平台常见的一种约定,GCC、Clang、VS编译器均默认采用该约定。
  • stdcall: 32位windows上的一种约定。
  • Microsoft x64: 微软提出的基于x86_64架构的windows系统上一种调用约定。
  • System V AMD64: 基于x86_64架构Linux系统上广泛使用的一种调用约定。
posted @ 2025-09-10 01:27  华容道专家  阅读(4)  评论(0)    收藏  举报