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