Winapi 在NASM(stdcall)中调用LONGLONG RtlLargeIntegerDivide(LONGLONG,LONGLONG,LONGLONG*)
我正在尝试调用以下函数:Winapi 在NASM(stdcall)中调用LONGLONG RtlLargeIntegerDivide(LONGLONG,LONGLONG,LONGLONG*),winapi,assembly,nasm,calling-convention,stdcall,Winapi,Assembly,Nasm,Calling Convention,Stdcall,我正在尝试调用以下函数: long long RtlLargeIntegerDivide(long long dividend, long long divisor, long long* pRemainder) 在汇编代码(NASM)中。它使用stdcall调用约定,并返回商。以下是规格: 输入:[EDX,EAX](股息),[ECX,EBX](除数) 输出:[EDX,EAX](商),[ECX,EBX](余数) 我该怎么做呢?(我的主要问题是不完全理解EBP和ESP,以及它们与局部变量的关系。
long long RtlLargeIntegerDivide(long long dividend, long long divisor, long long* pRemainder)
在汇编代码(NASM)中。它使用stdcall调用约定,并返回商。以下是规格:
输入:[EDX,EAX](股息),[ECX,EBX](除数)
输出:[EDX,EAX](商),[ECX,EBX](余数)
我该怎么做呢?(我的主要问题是不完全理解EBP和ESP,以及它们与局部变量的关系。)
(不,这不是家庭作业;我正在尝试实现一个包装器C运行时库。)
谢谢大家! 在32位模式下,您根本不必使用EBP来访问局部变量,这只是16位时间的惯例,现在不管怎样,这与我们无关 ESP是你的堆栈指针,我想你知道。您可以通过减少ESP为局部变量“分配”空间 stdcall调用约定使用堆栈传递参数。它们在堆栈上的顺序正常,但如果使用
PUSH
,则意味着反向推送它们。积分返回值的单位为EAX(必要时为EDX)。被调用的函数清除堆栈中的参数
因此,以下代码应该满足您的要求:
sub ESP, 8; make room for remainder
push ESP ; pass pointer to remainder as argument
push ECX
push EBX ; pass divisor argument
push EDX
push EAX ; pass dividend argument
call RtlLargeIntegerDivide
; quotient returned in EDX:EAX
; so just load remainder from stack
pop EBX
pop ECX
(对于速度,您可以使用MOV
而不是PUSH
/POP
)