Вопрос

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

Для вызова требуется прототип для процедуры

&

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

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

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

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

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

Директиве INVOKE должна предшествовать инструкция 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

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

Это было полезно?

Решение

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

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

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

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

QueryPerformanceCounter PROTO :DWORD

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

LOCAL Freq  :QWORD
invoke QueryPerformanceFrequency, ADDR Freq

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

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

    .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 теперь содержат результат.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top