문제
나는 MASM32 어셈블리에 과제를 작성하고 거의 완료했지만 대답 할 수없는 두 가지 질문이 있습니다. 먼저, 컴파일하면 메시지를받습니다.
호출 절차에 프로토 타입이 필요합니다
&
잘못된 지시 오페라
첫 번째는이 코드 때문입니다.
.data?
Freq DWORD ?
Time1 DWORD ?
Time2 DWORD ?
.code
start:
invoke QueryPerformanceFrequency, addr Freq
invoke QueryPerformanceCounter, addr Time1
자, 나는 그것을 알고있다
호출 지시문에는 호출되는 절차에 대한 프로토 명령문이 있어야합니다.
그러나 프로토 문의 구문을 알았지 만 :
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
.Data 이후 Freq : Qword를 작성하면이 오류 메시지가 나타납니다.
레지스터 사용 오류로 가정합니다
또한 어디에 추가 해야하는지
QueryPerformanceCounter PROTO :DWORD
내가 아는 한 오류가 발생하지는 않았지만 여전히 확실하지 않습니다.
해결책
외부 API를 호출하려면 적절한 *.inc 파일과 해당 *.lib 파일을 포함해야합니다.
이 진술을 목록에 추가하십시오.
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
( masm32가 당신의 masm32 dir를 언급한다고 가정)
업데이트:
프로토 타입 정의는 기본적으로 어셈블러에게 스택에서 각 함수가 예상하는 매개 변수를 알려줍니다. 귀하의 경우 API는 하나의 32 비트 매개 변수가 스택에있을 것으로 예상하며, 이는 다음과 같은 프로토 타입에 의해 반영됩니다.
QueryPerformanceCounter PROTO :DWORD
Update2 :
Performance Counter API를 사용하려면 쿼드 워드가 필요합니다. 그 이유는 API가 파라미터 (따라서 프로토 타입의 dword)로 쿼드 워드 (64 비트)에 대한 포인터를 기대하기 때문입니다.
LOCAL Freq :QWORD
invoke QueryPerformanceFrequency, ADDR Freq
이것은 트릭을 수행해야합니다.
업데이트 :
여기 저에게 맞는 완전한 예가 있습니다.
.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
나는 그것이 IT 인 것 같아요 :) ESI와 EDI는 이제 결과를 포함합니다.