我有一个32位值的数组( nativeParameters长度为nativeParameterCount )和一个指向函数的指针( void*到cdecl函数,这里是method->nativeFunction ),它应该被调用。 现在我正在尝试这样做:

// Push parameters for call
if (nativeParameterCount != 0) {
    uint32_t count = 0;
pushParameter:
    uint32_t value = nativeParameters[nativeParameterCount - count - 1];
            asm("push %0" : : "r"(value));
    if (++count < nativeParameterCount) goto pushParameter;
}

// Call method
asm("call *%0" : : "r"(method->nativeFunction));

// Return value
uint32_t eax;
uint32_t edx;
asm("push %eax");
asm("push %edx");
asm("pop %0" : "=r"(edx));
asm("pop %0" : "=r"(eax));
uint64_t returnValue = eax;

// If the typesize of the methods return type is >4 bytes, or with EDX
Type returnType = method->returnType.type;
if (TYPE_SIZES[returnType] > 4) {
    returnValue |= (((uint64_t) edx) << 32);
}

// Clean stack
asm("add %%esp, %0" : : "r"(parameterByteSize));

此方法是否适合执行本机调用(假设所有目标函数仅接受32位值作为参数)? 我可以确定它不会破坏堆栈或乱用寄存器,或者以某种方式影响正常流量吗? 此外,还有其他方法吗?

===============>>#1 票数:2 已采纳

您可能希望使用dyncall libary来完成所有这些处理,而不是自己手动执行此操作。

  ask by maxdev translate from so

未解决问题?本站智能推荐:

2回复

此汇编函数调用是否安全/完整?

我没有组装经验,但这是我一直在努力的工作。 如果我缺少传递参数和通过汇编中的指针调用函数的任何基本方面,请输入。 例如,我想知道是否应该恢复ecx , edx , esi和edi 。 我读到它们是通用寄存器,但是我找不到它们是否需要还原? 通话后我该做些清理吗? 这是我现在拥有
6回复

编写VM-格式正确的字节码?

我正在用C编写一个虚拟机,只是为了好玩。 me脚,我知道,但是幸运的是我很开心,所以希望没人能取笑:) 我编写了一个非常快的'脏'虚拟机,它读取(我自己的)ASM行并执行操作。 现在,我只有3条指令: add , jmp , end 。 一切都很好,能够输入行(执行类似write_l
1回复

带有内联汇编段错误的程序,除非以函数调用为前缀

测试运行: 除非取消注释printf调用,否则为什么程序会崩溃? 这是两个函数的反汇编: 确定版本(带printf调用): 崩溃版本(不调用printf ):
1回复

使用内联ASM调用函数

有没有办法通过使用内联汇编调用MessageBox ? 编辑:您提供的链接很棒,但“睡眠”只有一个参数。 我需要一种方法将多个参数传递给我需要调用的函数。 像MessageBox函数一样。
1回复

如何编写从汇编代码调用的C函数

我需要编写一个C函数,它将从linux内核中的汇编代码中调用。 应该考虑哪些特殊问题? 我有一些想法,但任何人都可以提供更多细节: (1)召集会议 确保组装中的呼叫者和c中的被叫者握手良好。 但是我应该使用哪种调用约定? 如何声明c函数并在汇编代码中声明它? (
1回复

从全局内联汇编调用静态函数

我试图定义一个没有任何序言/结尾的函数,一个“到达地址”,以便它可以调用由编译器正确管理的内部函数(对调用者清理环境有用)。 我发现可以使用内联汇编程序创建全局标签,但是在同一文件中调用另一个函数时遇到问题。 当我按此处列出的顺序编译代码时,我收到警告: 警告:“ handle
1回复

调用联汇编用户定义的C函数

假设我有这个: 我知道,在一个普通的.asm程序,你会被reuqired说EXTRN __fucntionName,但这是内联汇编,可以用户自定义函数可以内联汇编这样调用? 如何? 我使用VS2008。
4回复

使用__asm从十六进制偏移量调用函数

我不懂汇编程序,所以我不确定该怎么做。 我有一个程序正在与另一个挂钩。 我已经获得了钩子程序的.exe中函数所在位置的偏移量 那么现在如何使用__asm {}来调用该函数?
2回复

切换C ++函数的callstack

这是我之前关于切换C callstack的问题。 但是,C ++使用不同的调用约定(thiscall),可能需要一些不同的asm代码。 有人可以解释这些差异,并指出或提供一些切换C ++ callstacks的代码片段(最好是在GCC内联asm中)? 谢谢,詹姆斯
2回复

gcc中扩展的asm:执行“ stosb”时出现分段错误

这个问题已经在这里有了答案: 为什么在写入以“ char * s”而不是“ char s []”初始化的字符串时出现分段错误? 17个答案 问题是,当程序进入stosb行时,它将显示错误:“程序收到信号SIGSEGV,分段错误。” 我不知道为什么,有什么想法吗?