如何组装win32的简单独立函数,哪个汇编程序?

时间:2011-11-03 11:06:28

标签: assembly x86 nasm

很多tnx求助

我想组装一些像

这样的简单函数
    struct float3
    {
     float x;
     float y;
     float z;
    };

    inline float dot(float3* a, float3* b)
    {
      return (*a).x * (*b).x + (*a).y * (*b).y + (*a).z * (*b).z;
    }

或更简单的开头

    int add(int a, int b) 
    { 
      return a + b; 
    }

我需要在x86程序集中编写它并生成.obj文件以进行链接 它并从c代码调用

1)汇编程序应该是免费的并且可以免费使用 2)它应该为win32组装x86 3)应该能够生成较旧的omf obj二进制文件(这可能是我可以跳过因为 可能我可以用一些工具objnonv通过agner雾转换coff到omf,也许) 4)应该支持新的指令集 - 至少sse但更好的avx也

我还需要一个例子如何在其下编写这样的函数,以及如何编写 将它组装成obj

很多tnx, 冷杉

[编辑]

我找到了部分解决方案 - 在nasm我可以组装

    segment _TEXT public align = 1 class = CODE use32

    global  asm_main

    asm_main:
    enter   0,0
    pusha
    ;---------------------------
    ;
    ;
    ;----------------------------
    popa
    mov     eax, 2324            ; return back to C
    leave
    ret

在c中我可以使用它

    extern "C" int __cdecl asm_main(void);

    int ret_status = asm_main();  //gets 2324 as i want

但是当我尝试在其余部分

之前添加数据部分时,我有下一个错误
    segment _DATA public align = 4 class = DATA use32

    txt1 db    "xxxxxxxxxxxxx", 0
    txt2 db    "yyyyyyyyyyyyy", 0

我的旧版borland c ++ 5.5.1编译器出错了

    Fatal: 'myasm.obj': Additional segments need to be defined in a .def file
是谁知道我能做什么?

3 个答案:

答案 0 :(得分:1)

NASM是迄今为止我用过的最好的。在这里查看OMF支持。 关于将汇编代码链接到C ++,您可以在此处查看link

答案 1 :(得分:1)

使用MASM,它是免费下载或MS Visual Studio的一部分:

http://www.masm32.com/masmdl.htm

有一个命令行选项可以导出将函数链接到其他应用程序所需的目标文件:

http://msdn.microsoft.com/en-us/library/s0ksfwcf(v=vs.80).aspx

或者你可以像往常一样创建一个DLL并链接它。

答案 2 :(得分:1)

MASM是迄今为止最好的Windows汇编程序。 NASM更面向Linux。

结构以以下形式编写:

FLOAT3 STRUCT
    x DWORD ?
    y DWORD ?
    z DWORD ?
FLOAT3 ENDS

因为我对nasm更熟悉,所以add函数看起来像这样:

编辑:

假设我们有另一个rutine,想要在屏幕上打印hello world(这是一个linux rutine!)

segment .data

text dw "hello",10,0 ; dw stans for define word
text_len EQU $ - text ; get the length of text

segment .text
extern _add
extern print

print:    ; not exportable to C in this format
    mov eax,4 ; 4 indices we what to write
    mov ebx,1 ; 1 indicated standard output
    mov ecx,text ; address of text is now in registe ecx
    mov edx,text_len ; value of text len is now in register edx
    int 80H ; now we call the kernel

    mov eax,1 ; last 3 lines enable us to exit the program normally. 
    xor ebx,ebx
    int 80H




_add:
   enter 0,0
   mov eax,[ebp+8]  ; first argument
   mov ebx,[ebp+12]  ; second argument
   add eax,ebx
   leave
   ret

你可以使用nasm -f win32 first.asm

组装它

然后在c extern

中声明原型