ассемблер простой ассемблер для win32, какой ассемблер? - PullRequest
1 голос
/ 03 ноября 2011

много тхн за помощь

Я хочу собрать некоторую простую функцию, такую ​​как

    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) он должен собрать x86 для win32 3) должен быть в состоянии произвести более старый двоичный файл omf obj (возможно, я могу пропустить, потому что возможно я мог бы преобразовать coff в omf с помощью некоторого инструмента objnonv, возможно, agner fog) 4) должен поддерживать новые наборы инструкций - по крайней мере, sse, но лучше и avx

Также мне нужен пример, как написать такую ​​функцию, под ней и как собрать его в obj

много тнкс, пихта

[править]

Я нашел частичное решение - в носу я могу собрать

    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 ]

1 голос
/ 03 ноября 2011

Используйте MASM, который можно загрузить бесплатно или является частью MS Visual Studio:

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

Существует опция командной строки для экспорта объектного файла, необходимого для связи вашей функции с другимиприложения:

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

Или вы можете просто создать DLL и связать ее как обычно.

1 голос
/ 03 ноября 2011

MASM - безусловно лучший ассемблер для Windows. NASM гораздо более ориентирован на Linux.

Структура записывается в виде:

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

Поскольку я гораздо лучше знаком с nasm, функция добавления будет выглядеть так:

РЕДАКТИРОВАНИЕ:

предположим, у нас есть еще одна рутина, которая хочет напечатать hello world на экране (это рутина linux!)

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

1 голос
/ 03 ноября 2011

NASM - лучшее, что я использовал до сих пор. Ищите здесь поддержку OMF . О связывании кода сборки с C ++ вы можете посмотреть здесь ссылка

...