将MASM对象与C对象链接会产生错误的结果

时间:2019-03-02 09:22:32

标签: c assembly linker masm

我已经在程序集中实现了一个简单的宏“ intadd”,该宏将两个整数(QWORD)相加。 C语言中的驱动程序代码也使用QWORDS,它是stdint.h中uint32_t的typedef。无论参数如何,输出始终为7。

asm.asm

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

我还尝试将y移至ebx,然后添加eax,ebx,但这会产生相同的结果。

C代码段

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 :(得分:2)

即使使用ML64.exe,PROC指令也会在堆栈中搜索参数。但是"Microsoft x64 calling convention"在寄存器中传递参数。您可以将寄存器保存在所谓的影子空间中的过程中,或者-更好的是-直接使用寄存器:

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

顺便说一句:DWORD等同于unsigned int。因此,请调整您的格式字符串:printf("%u", intadd(1,1));。或在C文件中使用C类型int