Function MASM如何进行所需的函数调用

Function MASM如何进行所需的函数调用,function,masm,Function,Masm,我想知道,如何做到以下几点。 我有一个数组,其中我必须求和数字(简单) 但问题是,我必须对它进行函数调用, get是通过特定寄存器的参数。我如何实现这一点? 在这种情况下,函数需要通过ESI获取数组(偏移量),并通过ECX获取数组的长度。 请教育我 编辑: 与此同时,我想出了这个主意。不知道这是否有效,因为我的MASM complling只是无缘无故地自我破坏 .data intarray DWORD 10000h,20000h,30000h,40000h .code szummer pro

我想知道,如何做到以下几点。 我有一个数组,其中我必须求和数字(简单) 但问题是,我必须对它进行函数调用, get是通过特定寄存器的参数。我如何实现这一点? 在这种情况下,函数需要通过ESI获取数组(偏移量),并通过ECX获取数组的长度。 请教育我 编辑: 与此同时,我想出了这个主意。不知道这是否有效,因为我的MASM complling只是无缘无故地自我破坏

.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指令仅适用于C(cdecl)、STDCALL、BASIC、FORTRAN和PASCAL。所有这些约定都在堆栈上传递参数。因此,不能使用INVOKE在寄存器中传递参数。您可以改为使用汇编指令。您的程序-稍微修改;-)-包括(因为“ExitProcess”):


invoke
宏将把参数推送到堆栈上。如果要使用自己的自定义呼叫约定,请直接使用
call
指令。
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