|
▼ぬじぬじさん:
> 気になるので僕のコードの何処が間違っていたのか教えてもらえませんか。
まず、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
|
|