2011-11-03 19 views
1

求助如何爲win32組裝簡單的獨立函數?

多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)彙編程序應免費且可免費使用)它應該爲win32安裝x86 3)應該能夠生成較舊的omf obj二進制文件(這可能會跳過,因爲 可能我可以通過agner fog將某些工具objnonv轉換爲omf)也許) 4)應該支持新的指令集 - 至少SSE,但更好的AVX還

也是我需要一個例子TU怎麼寫這樣的功能,在它之下,如何 組裝它OBJ

多TNX, 杉

[編輯]

我已經找到部分解決方案 - 在NASM我可以組裝

的詞可以用它

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 

doeas有人知道我能做什麼嗎?

回答

1

MASM是迄今爲止最好的Windows彙編程序。 NASM更加面向Linux。

的結構書面形式:

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

因爲我更熟悉NASM,附加功能是這樣的:

編輯:

假設我們有另一個rutine ,這是想在屏幕上打印你好世界(這是一個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原型進行組裝

+0

tnx很多,我會嘗試一下,你能否告訴我在這段代碼中使用ram數據(數據段)?我會檢查,如果我仍然有我的鏈接器錯誤, –

+0

我希望我回答你的問題:) – Andro

+0

我會檢查它;需要休息一段時間,因爲我很厭倦了鏈接錯誤 –

1

NASM是我迄今使用過的最好的。在這裏尋找支持OMF。 關於彙編代碼鏈接到C++,你可以看看這裏link

+0

我曾試圖NASM 2小時前,但還沒有找到如何寫這樣的功能,以及如何'準備好'鏈接到c(如何導出函數名稱);有人可以鏈接我或編寫這樣的int myAdd(int a,int b)代碼在nasm或其他準備好從c prog –

+0

@ user982377鏈接的代碼中,您可以查看[this](http://wiki.osdev.org/C%2B%2B_to_ASM_linkage_in_GCC)瞭解。 – 6D65