首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在NASM (stdcall)中调用龙龙RtlLargeIntegerDivide( LONGLONG,LONGLONG,NASM*)

在NASM (stdcall)中调用龙龙RtlLargeIntegerDivide( LONGLONG,LONGLONG,NASM*)
EN

Stack Overflow用户
提问于 2010-12-27 00:22:07
回答 1查看 292关注 0票数 2

我正在尝试调用以下函数:

代码语言:javascript
复制
long long RtlLargeIntegerDivide(long long dividend, long long divisor, long long* pRemainder)

在汇编代码(NASM)中。它使用stdcall调用约定,并返回商。以下是规格说明:

输入:EDX,EAXECX,EBX

输出:EDX,EAXECX,EBX

我该怎么做呢?(我的主要问题是不能准确地理解EBP和ESP,以及它们与局部变量的关系。)

(不,这不是家庭作业;我正在尝试实现一个包装器C运行时库。)

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-27 06:18:39

在32位模式下,你根本不需要使用EBP来访问局部变量,这只是16位时代遗留下来的约定,现在我们已经不关心它了。

ESP是你的堆栈指针,我假设你知道这一点。你可以通过递减ESP为你的局部变量“分配”空间。

stdcall调用约定使用堆栈进行参数传递。它们在堆栈上的顺序是正常的,但如果您使用的是PUSH,这意味着您会将它们反向推送。整数返回值的格式为EAX (必要时为EDX )。被调用的函数从堆栈中清除参数。

因此,下面的代码应该可以执行您想要的操作:

代码语言:javascript
复制
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)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4534529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档