| 
    
     |  | ▼ぬじぬじさん: > 気になるので僕のコードの何処が間違っていたのか教えてもらえませんか。
 まず、MASM for AMD64 には .model が使えません。まぁ、AMD64 専用なんで当たり前ですが... あと、
 _TEXT    SEGMENT    DWORD PUBLIC USE32 'CODE'
 この書式も通りません。
 ここを AMD64 用に置き換えても、エラーが出て通りません。どうも、PUSH POP が使えない模様。なんで、使えないのかはまだ調べていないのですが... 何を隠そうレジスタ数が増えまくっているので、関数呼び出しのたびに PUSH して POP なスタイルは大変かもしれません。AMD64 のマニュアルはまだちゃんと読んでいない(オイ)のでよくわからないのですが...
 
 とにかく MASM for AMD64 はアレコレ擬似コード周りが変更になっているのですが、資料が少なく(MSDN 以外に見つからない)困っています。最終的にはスタックを介した引数渡しができると良いとは思うのですが...
 
 
 アセンブルするだけなら以下のコードでオッケー。関数としての機能は果たせませんが... かなりコメントアウトしてます。
 
 ;    .586p
 
 ;_TEXT    SEGMENT    DWORD PUBLIC USE32 'CODE'
 ;    ALIGN    4
 .code
 
 
 ;; DWORD cpuid(DWORD dwOP, DWORD *lpAX, DWORD *lpBX, DWORD *lpCX, DWORD *lpDX)
 _cpuid    PROC
 ;; ...
 ;; ESP+0C [lpBX]
 ;; ESP+08 [lpAX]
 ;; ESP+04 [dwOP]
 ;; ESP+00 [RETURN-ADDESS]
 ;    PUSH    EBP
 MOV    EBP, ESP
 
 ;; ...
 ;; ESP+0C [lpAX]
 ;; ESP+08 [dwOP]
 ;; ESP+04 [RETURN-ADDRESS]
 ;; ESP+00 [EBP]
 ;; EBP == ESP
 ;    PUSH    EDI
 ;PUSH    EAX
 ;    PUSH    EBX
 ;    PUSH    ECX
 ;    PUSH    EDX
 
 ;; EAX = dwOP;
 MOV    EAX, DWORD PTR [EBP+1*4+4]
 
 CPUID
 
 ;; EDI = lpAX;
 MOV    EDI, DWORD PTR [EBP+2*4+4]
 ;; *EDI = EAX;
 MOV    DWORD PTR [EDI], EAX
 
 ;; *lpBX = EBX;
 MOV    EDI, DWORD PTR [EBP+3*4+4]
 MOV    DWORD PTR [EDI], EBX
 
 ;; *lpCX = ECX;
 MOV    EDI, DWORD PTR [EBP+4*4+4]
 MOV    DWORD PTR [EDI], ECX
 
 ;; *lpDX = EDX
 MOV    EDI, DWORD PTR [EBP+5*4+4]
 MOV    DWORD PTR [EDI], EDX
 
 ;    POP    EDX
 ;    POP    ECX
 ;    POP    EBX
 ;POP    EAX
 ;    POP    EDI
 
 
 ;; return dwOP;
 MOV    EAX, DWORD PTR [EBP+1*4+4]
 ;    POP    EBP
 RET
 _cpuid    ENDP
 
 
 ;; struct {
 ;;  DWORD dwLower;
 ;;  DWORD dwUpper;
 ;; } rdtsc();
 _rdtsc    PROC
 ;; ...
 ;; ESP+0C [CALLER'S LOCAL VARIABLES]
 ;; ESP+08 [CALLER'S LOCAL VARIABLES]
 ;; ESP+04 [POINTER TO RETURN VALUE]
 ;; ESP+00 [RETURN ADDRESS]
 ;    PUSH    EDI
 ;    PUSH    EAX
 ;    PUSH    EDX
 
 ;; ...
 ;; ESP+14 [CALLER'S LOCAL VARIABLES]
 ;; ESP+10 [POINTER TO RETURN VALUE]
 ;; ESP+0C [RETURN ADDRESS]
 ;; ESP+08 [EDI]
 ;; ESP+04 [EAX]
 ;; ESP+00 [EDX]
 MOV    EDI, DWORD PTR [ESP+10H]
 
 RDTSC
 
 MOV    DWORD PTR [EDI+0], EAX
 MOV    DWORD PTR [EDI+4], EDX
 
 ;    POP    EDX
 ;    POP    EAX
 ;    POP    EDI
 
 XOR    EAX, EAX
 RET
 _rdtsc    ENDP
 end
 
 PUBLIC    _cpuid
 PUBLIC    _rdtsc
 
 END
 
 ;; THE END OF FILE
 
 |  |