문제

나는 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는 이제 결과를 포함합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top