在程序集中创建Hello World库函数并从C#调用它

Fil*_*erg 5 .net c# vb.net assembly inline-assembly

假设我们在这个答案中使用NASM:如何在windows下的汇编中编写hellow world.

关于汇编,我得到了一些关于c#或任何其他.net语言的想法和问题.

首先,我希望能够创建一个具有以下带有HelloWorld此参数的函数的库:

  • 名称

在C#中,方法签名会像这样解释:void HelloWorld(string name)它会打印出像这样的东西

Hello World来自名字

我已经搜索了一下但是找不到那么好的和干净的材料让我开始.我之前知道一些基本的装配gas.

因此,正确方向的任何指针都非常适用.

把它们加起来

  • 在ASM(NASM)中创建一个带有一个或多个参数的例程
  • 编译并创建上述功能的库
  • 以任何.net语言包含库
  • 调用包含的库函数

奖金功能

  • 如何处理返回值?
  • 是否可以内联编写ASM方法?

在程序集或c中创建库时,您确实遵循某种"预定义"方式,即c调用对话,是否正确?

Cod*_*ous 11

像这样的东西应该让你一个工作的DLL:

extern _printf

section .text
global _hello
_hello:
    push ebp
    mov ebp, esp

    mov eax, [ebp+12]
    push eax
    push helloWorld
    call _printf
    add esp, 8
    pop ebp
    ret

export _hello

helloWorld: db 'Hello world from %s', 10, 0
Run Code Online (Sandbox Code Playgroud)

然后你只需要使用P/Invoke调用'hello'函数.它不会自行清理,所以你需要将CallingConvention设置为Cdecl; 你还需要告诉它你正在使用ANSI字符串.未经测试,但它应该工作正常.

using System.Runtime.InteropServices;

namespace Test {
    public class Test {
        public static Main() {
            Hello("C#");
        }

        [DllImport("test.dll", EntryPoint="hello", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)]
        public static extern Hello(string from_);
    }
}
Run Code Online (Sandbox Code Playgroud)