Связывание объектов MASM с объектами C дает неверные результаты - PullRequest
0 голосов
/ 02 марта 2019

Я реализовал простой макрос "intadd" в сборке, который добавляет два целых числа (QWORD).Код драйвера в C также использует QWORDS, который является typedef для uint32_t из stdint.h.Выходные данные всегда равны 7, независимо от аргументов.

asm.asm

intadd PROC x:DWORD, y:DWORD
mov eax, x
add eax, y
ret
intadd ENDP
END

Я также пытался переместить y в ebx, а затем добавить eax, ebx, но это приводит к тем же результатам.

C-Snippet

extern DWORD intadd(DWORD x, DWORD y);
printf("%i", intadd(1,1));

Нужно ли устанавливать флаг переноса или что-то?Я связываю файлы с

ml64 asm.asm /c && cl.exe cfile.c /EHsc /c &&
link asm.obj cfile.obj /out:exe.exe

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 02 марта 2019

Директива PROC ищет в стеке аргументы даже при использовании ML64.exe.Но «Соглашение о вызовах Microsoft x64» передает аргументы в регистрах.Вы можете сохранить регистры в процедуре в так называемом теневом пространстве или - лучше - работать напрямую с регистрами:

intadd PROC
    mov eax, ecx
    add eax, edx
    ret
intadd ENDP

Кстати: DWORD эквивалентно unsigned int.Итак, адаптируйте строку формата: printf("%u", intadd(1,1));.Или используйте тип C int в файле C.

...