Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何为win32汇编简单的独立函数,哪个汇编程序?_Assembly_X86_Nasm - Fatal编程技术网

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

Assembly 如何为win32汇编简单的独立函数,哪个汇编程序?,assembly,x86,nasm,Assembly,X86,Nasm,需要帮助吗 我想组装一些简单的函数,比如 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

需要帮助吗

我想组装一些简单的函数,比如

    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二进制文件(这也许我可以跳过,因为 也许我可以用agner fog提供的工具objnonv将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
有人知道我能做什么吗?

是我迄今为止用过的最好的。在这里寻求支持。
关于将汇编代码链接到C++,你可以在这里查看

使用Masm,它是免费下载或MS VisualStudio:

的一部分。

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


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

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

结构以以下形式编写:

FLOAT3 STRUCT
    x DWORD ?
    y DWORD ?
    z DWORD ?
FLOAT3 ENDS
因为我对nasm更为熟悉,所以add函数如下所示:

编辑:

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

您可以使用nasm-f win32 first.asm来组装它


然后在cextern中声明原型

我在2小时前尝试过nasm a,但没有找到如何编写这样的函数以及如何“准备好”链接到c(如何导出函数名);有人可以链接我或者在nasm中编写这样的int-myAdd(int-a,int-b)代码或者其他可以从c链接的代码吗prog@user982377你可以多看看insight.tnx,我会试试看,你能不能在这段代码中给我展示一下ram数据(数据部分)的用法?我会检查我是否仍然有我的链接器错误,我希望我回答了你的问题:)我会检查它;需要休息一段时间,因为我对链接器错误感到非常厌倦。我得到了相同的链接器错误“致命:
fir.asm”:需要在.def文件中定义其他段
解决它导致错误的是-f win32 switch(而不是my-f obj-),只需稍后使用下划线将coff转换为omf即可
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