Tag: 函数调用

在程序集中调用C函数

尽管我到处搜索,但我找不到解决问题的方法。问题是我在C文件“hello.c”中定义了一个函数“hello_world()”,我想在汇编文件中调用此函数。 “hello_assembly.asm”。任何人都可以帮帮我吗? 谢谢。

哪个订单function称为

是否有一些确定的顺序,在下面的表达式中调用函数或它是否从编译器到编译器不同? 此处的规则是否适用 – 在C中,未指定大多数运算符的函数和操作数的参数的计数顺序。 在此Wiki页面中找到了上述规则 a = (f1(10, 20) * f2(30, 40)) + f3()

使用GCC的内联汇编直接调用

如果要从内联汇编调用C / C ++函数,可以执行以下操作: void callee() {} void caller() { asm(“call *%0” : : “r”(callee)); } 然后GCC将发出如下所示的代码: movl $callee, %eax call *%eax 这可能会有问题,因为间接调用会破坏旧CPU上的管道。 由于callee的地址最终是常量,因此可以想象可以使用i约束。 引自GCC在线文档 : ‘我” 允许立即整数操作数(具有常量值的操作数)。 这包括符号常量,其值仅在汇编时或以后知道。 如果我尝试像这样使用它: asm(“call %0” : : “i”(callee)); 我从汇编程序中收到以下错误: 错误:后缀或操作数对`call’无效 这是因为GCC会发出代码 call $callee 代替 call callee 所以我的问题是是否可以使GCC输出正确的call 。

函数参数推送顺序

为什么函数参数按从右到左的顺序压入堆栈?

如何获得修改任何参数的function?

我的目标: 我必须创建一个加起来两个分数的函数。 我已经定义了一个名为fraction的新struct (typedef)。 该函数不能有返回类型fraction ,它必须是void ,因此它必须修改输入的一个参数,我该如何实现呢? 指针可能吗? 你会如何修改我的代码来实现它? 这是我的代码: typedef struct{ char sign; int num; int den; } fraction; void sum(fraction, fraction, fraction); int main(void) { fraction op1, op2, solution; sum(op1, op2, solution); return 0; } void sum(fraction f1, fraction f2, fraction sol){ if (f1.sign == ‘-‘) { f1.num = f1.num * -1; } […]

使用指针的所有函数的警告消息。 期望’int *’但参数的类型为’int(*)’

代码工作正常我只是担心我得到的警告信息,是否有办法让它们不出现? 有什么理由担心他们吗? 在代码中更远的地方,我不太明白我做了什么或为什么它起作用。 它之前没有工作,所以我查看其他人用指针做了什么,它现在有效 Warning passing argument 1 of ‘readarray’ from incompatible pointer type [-wincomp readarray(&a); ^ note: expected ‘int*’ but argument is of type ‘int(*)[10]’ void readarray (int*); ^ 这是警告信息,我为每个function得到它^^^^^^^^^^^^^^^^^^ 我知道为什么它有问题,我想,但我不明白我怎么能改变任何东西 #include #define n 10 void readarray (int*); int findmaxvalue(int*); void reversearray(int*, int*); void printarray(int*); int main(void) { int a[n], i, b[n]; for (i […]

“array”和“&array ”完全可以互换吗?

是的,以前曾经多次询问过,但我想知道哪一个更合适? typedef struct { int a; int addr[8]; } usr_command; usr_command* p_usr_command; int foo(int* parameter) {} 那么哪一个不太容易出问题? foo(p_usr_command->addr); 要么 foo(&p_usr_command->addr[0]); ?

这个汇编函数调用安全/完整吗?

我没有assembly经验,但这是我一直在努力的。 如果我缺少传递参数和通过程序集中的指针调用函数的任何基本方面,我想输入。 例如,我想知道我是否应该恢复ecx , edx , esi , edi 。 我读过它们是通用寄存器,但我找不到它们是否需要恢复? 打电话后我应该做什么样的清理工作? 这是我现在的代码,它确实有效: #include “stdio.h” void foo(int a, int b, int c, int d) { printf(“values = %d and %d and %d and %d\r\n”, a, b, c, d); } int main() { int a=3,b=6,c=9,d=12; __asm__( “mov %3, %%ecx;” “mov %2, %%edx;” “mov %1, %%esi;” “mov […]

系统调用与函数调用

系统调用和函数调用有什么区别? fopen()是系统调用还是函数调用?

通过c / c ++中的内存地址调用函数

鉴于函数原型及其在内存中的地址的知识,是否可以从另一个进程或一些只知道原型和内存地址的代码调用此函数? 如果可能,如何在代码中处理返回的类型?