首页 > 解决方案 > 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

标签: functionmasm

解决方案


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

推荐阅读