2010/8/22:本掲示板は閲覧専用です。データが一部破損しておりますがご了承ください。
  新規投稿 ┃ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索 ┃設定 ┃ホーム  
242 / 376 ツリー ←次へ | 前へ→

【556】.asm ぬじぬじ 04/1/12(月) 22:26 [添付][添付]

【559】Re:最終的には... ぬじぬじ 04/1/13(火) 2:30
【560】Re:最終的には... ひよひよ 04/1/13(火) 8:39
【561】Re:最終的には... ぬじぬじ 04/1/13(火) 10:27
【562】逆転の発想... ひよひよ 04/1/13(火) 12:05 [添付][添付]
【563】Re:逆転の発想... ぬじぬじ 04/1/13(火) 12:40 [添付]
【564】Re:逆転の発想... ぬじぬじ 04/1/13(火) 12:41 [添付]
【565】Re:逆転の発想... ぬじぬじ 04/1/13(火) 12:45 [添付]
【566】Re:逆転の発想... ぬじぬじ 04/1/13(火) 12:46 [添付]
【568】Re:逆転の発想... ひよひよ 04/1/13(火) 12:50
【573】CPUID バッチリ ひよひよ 04/1/16(金) 23:55
【567】Re:逆転の発想... ひよひよ 04/1/13(火) 12:48

【559】Re:最終的には...
←back ↑menu ↑top forward→
 ぬじぬじ E-MAIL  - 04/1/13(火) 2:30 -

引用なし
パスワード
    気になるので僕のコードの何処が間違っていたのか教えてもらえませんか。
 コンパイル・アセンブルすら通らなかったとか。コンパイル・アセンブルはおっけーだけどリンクで死ぬとか。実行すると鼻から悪魔がでるとか。cpuid()は呼び出せるけどrdtsc()を呼び出すとSEGVるとか。何も問題なく実行できるように見えて実行結果が間違っているとか。そもそもコンパイルすら試していないとか。

【560】Re:最終的には...
←back ↑menu ↑top forward→
 ひよひよ  - 04/1/13(火) 8:39 -

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

【561】Re:最終的には...
←back ↑menu ↑top forward→
 ぬじぬじ E-MAIL  - 04/1/13(火) 10:27 -

引用なし
パスワード
   ▼ひよひよさん:
> とにかく MASM for AMD64 はアレコレ擬似コード周りが変更になっているのですが、資料が少なく(MSDN 以外に見つからない)困っています。最終的にはスタックを介した引数渡しができると良いとは思うのですが...

 呼び出し時のパラメータの受け渡しに関する資料を見つけました。その名も``Calling Convention for AMD 64-Bit Environments'' (@http://msdn.microsoft.com/library/default.asp?url=/library/en-us/kmarch/hh/kmarch/64bitamd_7qqv.asp)。随所に現れる``[This is preliminary documentation and subject to change]''が泣かせます。
 これに拠ると``Integer values are passed (in order left to right) in RCX, RDX, R8, and R9 registers. The caller passes arguments five and above onto the stack.''だそうです。大学のHP-UXなマシンとそっくり。多分``Integer values''てのは64ビットなんだろうなあ。


 取り敢えず
---- ここから ----
<pre><code>
DWORD cpuid(DWORD dwOP, DWORD *lpAX, DWORD *lpBX, DWORD *lpCX, DWORD *lpDX)
{
  if (dwOP == 0) {
    *lpAX = (DWORD)lpAX;
    *lpBX = (DWORD)lpBX;
    *lpCX = (DWORD)lpCX;
    *lpDX = (DWORD)lpDX;
    return 1;
  } else {
    *lpAX = (DWORD)0x00584145;
    *lpBX = (DWORD)0x00584245;
    *lpCX = (DWORD)0x00584345;
    *lpDX = (DWORD)0x00584445;
    return -1;
  }
}

/* ``QWORD''てのを64ビットを表す型に変更してくれ */
QWORD rdtsc()
{
  return 0x0123456789abcdef;
}
</code></pre>
---- ここまで ----
てのをコンパイルしてアセンブリ言語コードを吐いてもらえないでしょうか。

【562】逆転の発想...
←back ↑menu ↑top forward→
 ひよひよ WEB  - 04/1/13(火) 12:05 -

引用なし
パスワード

[添付]〜添付ファイル〜
・名前 : mikomiko.c
・サイズ : 0.5KB

[添付]〜添付ファイル〜
・名前 : mikomiko.asm
・サイズ : 1.7KB
   アセンブルしたものを参考にすればよかったんですね... 昨日の苦労は一体なんだったんだ。

ちなみに mikomiko.asm の先頭にある listing.inc というのはよくわかりません。ファイルが開発環境内で見当たらないんですよね... 当然のようにアセンブルできなかったりします。 listing.cin をコメントアウトしてもアセンブルできないし。う〜む謎です。

【563】Re:逆転の発想...
←back ↑menu ↑top forward→
 ぬじぬじ E-MAIL  - 04/1/13(火) 12:40 -

引用なし
パスワード

[添付]〜添付ファイル〜
・名前 : cpuid.asm
・サイズ : 1.4KB
    お手数かけました。アセンブルが通るかどうか試してもらえませんか?

【564】Re:逆転の発想...
←back ↑menu ↑top forward→
 ぬじぬじ E-MAIL  - 04/1/13(火) 12:41 -

引用なし
パスワード

[添付]〜添付ファイル〜
・名前 : cpuid(2).asm
・サイズ : 1.4KB
    すまん。蟲です。

【565】Re:逆転の発想...
←back ↑menu ↑top forward→
 ぬじぬじ E-MAIL  - 04/1/13(火) 12:45 -

引用なし
パスワード

[添付]〜添付ファイル〜
・名前 : cpuid(3).asm
・サイズ : 1.4KB
    すまん。更に蟲です。

【566】Re:逆転の発想...
←back ↑menu ↑top forward→
 ぬじぬじ E-MAIL  - 04/1/13(火) 12:46 -

引用なし
パスワード

[添付]〜添付ファイル〜
・名前 : cpuid(4).asm
・サイズ : 1.4KB
    すまん。またまた蟲です。

【567】Re:逆転の発想...
←back ↑menu ↑top forward→
 ひよひよ WEB  - 04/1/13(火) 12:48 -

引用なし
パスワード
   ▼ぬじぬじさん:
> すまん。蟲です。
アセンブルできました(^_^)v
ってオブジェクトファイルつけても意味ないので報告だけ。
本番ではこのオブジェクトファイルを使わせてもらうとします。

【568】Re:逆転の発想...
←back ↑menu ↑top forward→
 ひよひよ WEB  - 04/1/13(火) 12:50 -

引用なし
パスワード
   ▼ぬじぬじさん:
> すまん。またまた蟲です。
こっちも通りました。

アセンブルしてリンクしても実行できないから試せない...
Athlon 64 欲しいなぁ〜。

【573】CPUID バッチリ
←back ↑menu ↑top forward→
 ひよひよ  - 04/1/16(金) 23:55 -

引用なし
パスワード
   戴いたコードバッチリ動作しました。
私が作ったものよりもずっとスマートでよい感じです。

242 / 376 ツリー ←次へ | 前へ→
  新規投稿 ┃ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索 ┃設定 ┃ホーム  
ページ:  ┃  記事番号:   
51982
(SS)C-BOARD v3.8(とほほ改ver2.1) is Free