GNU C内嵌汇编(x86)演示

来源:互联网 发布:淘宝买家等级 编辑:程序博客网 时间:2024/06/06 08:51
#include <stdio.h>const char fmstr[] = "ASM: %s - %d - %c\n";#if 1int myprintf(const char *fmstr, char *str, int id, char ch){int ret = 0;__asm__ __volatile__("pushl %%edx;"/*参数3压栈*/"pushl %%ecx;"/*参数2压栈*/"pushl %%ebx;"/*参数1压栈*/"pushl $fmstr;"/*参数0压栈*/"call printf;"/*调用函数*/"popl %%edx;"/*参数0退栈*/"popl %%edx;"/*参数1退栈*/"popl %%edx;"/*参数2退栈*/"popl %%edx;"/*参数3退栈*/: "=a"(ret)/*输出:返回值-->ret*/: "b"(str),"c"(id),"d"(ch)/*输入:str-->ebx, id-->ecx, ch-->edx*/);return ret;}#elseint myprintf(const char *fmstr, char *str, int id, char ch){int ret = 0;__asm__ __volatile__("movl %%ecx, 12(%%esp);""movl %%ebx, 8(%%esp);""movl %%eax, 4(%%esp);""movl $fmstr, (%%esp);""call printf;""movl %%eax, -12(%%ebp);""movl -12(%%ebp), %%eax": "=a"(ret)/*输出:返回值-->ret*/: "a"(str),"b"(id),"c"(ch)/*输入:buf-->eax, id-->ebx, ch-->ecx*/);return ret;}#endifint main(){int ret = 0;char buf[] = "NO.0";char ch = 'a';for(int i = 0; i < 9; i++){buf[3]++;#if 1printf("RET=%d\n", myprintf(fmstr, buf, i, ch));#elseprintf("RET=%d\n", printf(fmstr, buf, i, ch));#endifch++;}return ret;}
原创粉丝点击