Инструкция по сборке прототипа - PullRequest
1 голос
/ 09 февраля 2009

Я пишу задание в сборке MASM32 и почти выполнил его, но у меня есть 2 вопроса, на которые я не могу ответить. Сначала, когда я компилирую, я получаю сообщение:

INVOKE требуется прототип для Процедура

&

недопустимые операнды инструкции

первое связано с этим фрагментом кода:

.data?
Freq    DWORD ?
Time1   DWORD ?
Time2   DWORD ?

.code
start:
invoke QueryPerformanceFrequency, addr Freq
invoke QueryPerformanceCounter, addr Time1 

Теперь я знаю, что

Директиве INVOKE должен предшествовать по заявлению PROTO для процедуры будучи призванным.

но, хотя я узнал синтаксис оператора PROTO:

label PROTO [distance] [langtype] [,[parameter]:tag]

Я не совсем понимаю, что мне следует написать, чтобы это работало, и я даже не знаю, что вызывает вторую ошибку или как ее исправить ... = /


Редактировать

У меня уже есть эти библиотеки и они также:

.386
.model flat, stdcall
option casemap :none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib

Я работаю под Windows Vista на всякий случай, если это тоже поможет.


Редактировать 2

Если я пишу Freq: QWORD после .data, я получаю это сообщение об ошибке:

использование регистра, допущенного к ОШИБКЕ

а также куда мне добавить

QueryPerformanceCounter PROTO :DWORD

Который, насколько я знаю, не сделал ошибку, но все же я не уверен, что что-то изменил (я поместил это перед .data и после библиотек).

1 Ответ

2 голосов
/ 09 февраля 2009

Для вызова внешнего API вам необходимо включить соответствующий файл * .inc, а также соответствующий файл * .lib.
Попробуйте добавить эти заявления в свой список:

include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib

(при условии, что \ masm32 ссылается на ваш каталог masm32)

Обновление:
Определение прототипа в основном говорит ассемблеру, сколько параметров ожидает соответствующая функция в стеке. В вашем случае API ожидает, что в стеке будет находиться один 32-битный параметр, что отражается прототипом так:

QueryPerformanceCounter PROTO :DWORD

Update2:
Для того чтобы использовать API счетчика производительности, вам нужен четырехугольник. Причина заключается в том, что API ожидает указатель на четырехзначное слово (64 бита) в качестве параметра (поэтому DWORD в прототипе):

LOCAL Freq  :QWORD
invoke QueryPerformanceFrequency, ADDR Freq

Это должно сработать.

Update3:
Итак, вот полный пример, который работает для меня:

    .486
    .model flat, stdcall
    option casemap :none

    include \masm32\include\windows.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\masm32.inc

    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\masm32.lib

    doPerf     PROTO

.code

start:

    invoke doPerf
    invoke ExitProcess,eax

    doPerf proc

        LOCAL Freq  :QWORD
        invoke QueryPerformanceFrequency, ADDR Freq
        mov esi, dword ptr Freq
        mov edi, dword ptr Freq+4

        ret

    doPerf endp

end start 

Наверное, все :) ESI и EDI теперь содержат результат.

...