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

时间:2018-05-06 21:58:07

标签: function masm

我想知道,如何做到以下几点。 我有一个数组,我必须汇总数字(简单) 但扭曲的是,我必须有一个函数调用它, 得到的是特定寄存器的参数。我该如何实现? 在这种情况下,函数需要通过ESI获取数组(偏移量),并通过ECX获取它的长度。 请教育我 编辑: 在此期间,我已经想到了这一点。不知道这是否有效,因为我的MASM compliling无缘无故打破了自己

.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

1 个答案:

答案 0 :(得分:0)

MASM指令INVOKE仅适用于calling conventions C(cdecl),STDCALL,BASIC,FORTRAN和PASCAL。所有这些约定都传递堆栈上的参数。因此,您不能使用INVOKE在寄存器中传递参数。您可以使用汇编指令CALL代替。您的程序 - 略有修改;-) - 包含MASM32 library(因为" 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