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系统上广泛使用的一种调用约定。

浙公网安备 33010602011771号