function - MASM 如何进行所需的函数调用
问题描述
我想知道,如何执行以下操作。我有一个数组,我必须对数字求和(简单),但问题是,我必须有一个函数调用它,get 是通过特定寄存器的参数。我该如何实施?在这种情况下,函数需要通过 ESI 获取数组(偏移量),并通过 ECX 获取数组的长度。请教育我编辑:与此同时,我想出了这个。不知道这是否有效,因为我的 MASM 编译只是无缘无故地破坏了自己
.data
intarray DWORD 10000h,20000h,30000h,40000h
.code
szummer proc uses esi ecx,
ptrArray:PTR DWORD, ;points to the array
szArray: Dword ;array size
mov esi, ptrArray ;address of the array
mov ecx, szArray ;szize
mov eax, 0 ;set to 0
AS1:
add eax, [esi] ;add each int to sum
add esi, 4 ;point to next int
loop AS1 ;reapet for array size
ret;
szummer endp
main proc
mov ecx, OFFSET intarray
mov esi, LENGHTOF intarray
INVOKE ArraySum,ecx,esi
invoke ExitProcess,0
main endp
end main
解决方案
MASM 指令INVOKE仅适用于调用约定C (cdecl)、STDCALL、BASIC、FORTRAN 和 PASCAL。所有这些约定都在堆栈上传递参数。因此,您不能使用 INVOKE 在寄存器中传递参数。您可以改用汇编指令CALL。您的程序 - 稍作修改;-) - 包含MASM32 库(因为“ExitProcess”):
INCLUDE \masm32\include\masm32rt.inc
.DATA
intarray DWORD 10000h,20000h,30000h,40000h
.CODE
szummer proc uses esi ecx
mov eax, 0 ;set to 0
AS1:
add eax, [esi] ;add each int to sum
add esi, 4 ;point to next int
loop AS1 ;reapet for array size
ret;
szummer endp
main proc
mov esi, OFFSET intarray
mov ecx, LENGTHOF intarray
call szummer
invoke ExitProcess,0
main ENDP
END main
推荐阅读
- c# - 如何在asp net mvc中同时运行两个函数而不互相暂停
- r - 如何分析我在系统发育树的每个尖端都有多个个体的数据的特征?
- linux - 从两个不同的接口合并 tcpdump
- c++ - 使用 -std=c++17 编译时在 GCC 中恢复 std::auto_ptr
- c# - 如何创建动态数据库连接字符串C#
- r - 我在集群上的 R 中运行 1000 个并行模拟。之后管理和重新组合结果的最佳方法是什么?
- c++ - 具有专用成员函数的默认模板参数
- reactjs - 将 redux 存储与 Tampermonkey 一起使用
- python - Python和matlab给出不同的答案
- php - 如何只为表中的唯一行推出 JSON?