Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 在NASM(stdcall)中调用LONGLONG RtlLargeIntegerDivide(LONGLONG,LONGLONG,LONGLONG*)_Winapi_Assembly_Nasm_Calling Convention_Stdcall - Fatal编程技术网

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