我正在尝试调用以下函数:
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运行时库。)
谢谢!
发布于 2010-12-27 06:18:39
在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)
https://stackoverflow.com/questions/4534529
复制相似问题