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