我已经在程序集中实现了一个简单的宏“ 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
感谢您的帮助。
答案 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
。