Инструкция по сборке прототипа
Вопрос
Я пишу задание в сборке 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 теперь содержат результат.