很多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
是谁知道我能做什么?
答案 0 :(得分:1)
答案 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
中声明原型