如何从C调用内联汇编中的函数
我现在只是在玩在线游戏,我有点卡住了。我已经成功地调用了一个没有参数的函数,但是当涉及到调用一个有两个参数的函数时,我陷入了困境 下面的代码应该调用一个函数如何从C调用内联汇编中的函数,c,assembly,inline-assembly,C,Assembly,Inline Assembly,我现在只是在玩在线游戏,我有点卡住了。我已经成功地调用了一个没有参数的函数,但是当涉及到调用一个有两个参数的函数时,我陷入了困境 下面的代码应该调用一个函数(add),该函数将预定义的数字相加,它应该调用第二个函数(add parameter),其中两个参数应该相加 #include <stdio.h> int c = 4; int d = 5; void add() { int result = 1 + 2; printf("R
(add)
,该函数将预定义的数字相加,它应该调用第二个函数(add parameter)
,其中两个参数应该相加
#include <stdio.h>
int c = 4;
int d = 5;
void add() {
int result = 1 + 2;
printf("Result: %d\n", result);
}
void add_parameter(int a, int b) {
int result = a + b;
printf("Result: %d\n", result);
}
int main()
{
__asm__ __volatile__ ( "call add" );
// __asm__ __volatile__(
// "mov eax, offset c"
// "push eax"
// "mov eax, offset d"
// "push eax"
// "call add_parameter"
// "pop ebx"
// "pop ebx"
// );
__asm__ __volatile__ ( "mov eax, offset c" );
__asm__ __volatile__ ( "push eax" );
__asm__ __volatile__ ( "mov eax, offset d" );
__asm__ __volatile__ ( "push eax" );
__asm__ __volatile__ ( "call add_parameter" );
__asm__ __volatile__ ( "pop ebx" );
__asm__ __volatile__ ( "pop ebx" );
return 0;
}
在我的程序中,我尝试了两种方法,一种是一个单独的ASM调用,其中包含整个ASM代码,另一种是我将每行拆分为自己的ASM调用
不幸的是,我不确定这些方法中哪一种是正确的,更不用说最有效的了,但无论我使用哪种方法,我都会得到相同的错误。
如何解决此问题并调用函数add\u参数
感谢即使您使用AT&T语法(或使用
gcc-masm=intel
将其作为intel语法阅读)来修复您现在收到的错误消息,使用基本asm(无约束)也不安全;您可以修改寄存器值,也可以修改被调用的函数。您需要写入%eax而不是eax。我将其添加到重复项列表中,作为调用函数以确保安全所需的clobber声明示例。(即通过clobber列表描述呼叫约定)。这个问题是针对x86-64的,因此实际的arg传递是不同的(在regs中而不是堆栈中)。您在函数中使用基本Asm语句的整个方法完全有缺陷(始终使用扩展Asm),这与Intel与AT&T的语法混淆不同。
p_function.c:31: Error: too many memory references for `mov'
p_function.c:33: Error: too many memory references for `mov'