MASM как сделать нужный вызов функции - PullRequest
0 голосов
/ 07 мая 2018

Я хотел бы знать, как сделать следующее. У меня есть массив, где я должен суммировать числа (легко) но поворот в том, что мне нужно иметь вызов функции для этого, что получить это params через конкретные регистры. Как мне это реализовать? В этом случае функция должна получить массив (смещение) через 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

1 Ответ

0 голосов
/ 08 мая 2018

Директива 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
...