gcc 在c代码中内嵌汇编调用c函数: 只是证明曾经我来过

我怕我不写下来,将来我都不记得我还在 c 中嵌套过汇编语言,用汇编代码调用一个c函数的过程。

折腾了一下午,在网上查看相关的资料,然后照葫芦画瓢地在c代码中嵌套汇编,希望解决我所遇到的问题,可最后发现全是徒劳。

根据我的初步了解,在c中嵌套汇编来调用一个c函数的时候, 当c函数的参数过多时, 汇编代码没办法写, 好像对参数的数量有相当大的限制。

下面的代码,如果我将c函数的参数增加到3个时, 汇编代码我就写不出来了,  并不能通过简单的在汇编代码中增加一个参数来实现。

多增加一个参数,编译代码时,就会抛出错误:'asm' operand has impossible constraints|  ('asm'操作数有不可能的约束)

我是彻底的放弃了,到此为止吧。

 

int abc2(int a, int b)
{
printf("\n");

printf("参数a(%d): %d\n", &a, a);
printf("参数b(%d): %d\n", &b, b);
//printf("参数c(%d): %d\n", &c, c);
//printf("参数d(%d): %d\n", &d, d);

return a > b ? a : b;
}

 

int main(int argc, char *argv[])
{
void *saved_my_esp, *target_addr;
unsigned int return_eax, return_edx;

void *func = abc2;

int a = 10;
int b = 20;
int c = 30;
int d = 40;

printf("&a:%d\n", &a);
printf("&b:%d\n", &b);
printf("&func:%d\n", func);


//参考: https://bbs.csdn.net/topics/360148698


__asm__ __volatile__ (

"movl %%esp, %0;"

"movl %3, %%eax;" //变量: d
"push %%eax;"

"movl %4, %%eax;" //变量: c
"push %%eax;"


"movl %5, %%eax;" //函数
"call *%%eax;"

"mov %%eax, %1;"
"mov %%edx, %2;"
"movl %0, %%eax;"

//"movl %%eax, %%esp;" /** 加这一句, 就出错 **/

: "+m" (saved_my_esp), "=m" (return_eax), "=m" (return_edx)

: "r"(b), "r"(a), "r"(func) // 关于 m, r 说明: https://www.cnblogs.com/Jezze/archive/2011/12/23/2299838.html

: "%eax", "%edx", "%esp"
);

printf("saved_my_esp:%d\n", saved_my_esp);
printf("return_eax:%d\n", return_eax);
printf("return_edx:%d\n", return_edx);

printf("\n");

//printf("return_value:'%s'\n", return_eax
//printf("return_value:%d\n", *(int *)return_eax);
//printf("return_value:%lf\n", *(float *)return_eax);
//printf("return_value:%d\n", *(BYTE *)return_eax);

printf("return_value:%d\n", return_eax);

printf("\n");

printf("------------------end-------------\n");

return 0;

}

 

转载于:https://www.cnblogs.com/personnel/p/11414480.html

你可能感兴趣的:(gcc 在c代码中内嵌汇编调用c函数: 只是证明曾经我来过)