我在程序集中实现了一个简单的宏“intadd”,它添加了两个整数(QWORDs)。C中的驱动程序代码也使用QWORDS,这是stdint.h中uint32的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

如有任何帮助,我们将不胜感激。

最佳答案

PROC指令在堆栈中搜索参数,即使使用ML64.exe也是如此。但是"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

08-16 11:24