« 2015年6月 | メイン | 2016年4月 »

2016年3月

2016年3月26日 (土)

mllink$ 「64bit アセンブラに挑戦」の続き

ところで mllink$ あるいは mllink$.lnk というファイルが出来てると思います。
これはショートカットではなく ml64.exe が link.exe へオプションを渡すための
レスポンスファイルです。
エディター(メモ帳など)で開いてみると
--
/OUT:test64.exe
test64.obj
/subsystem:windows
/entry:Start
--
などとなっているのがわかります。

(ml64.exe のパス)\link.exe @mllink$.lnk

でリンクしてくれます。

あと、環境変数 LIB にライブラリのパスを設定しておけば、拡張子Lib のファイルを
コピーしてくる必要はありません。

set LIB="C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64"

と書いたバッチファイル(例えば setlib.bat )を用意して
実行しておけばよいでしょう。

2016年3月23日 (水)

64bit アセンブラに挑戦

私の visual studio 2010 は、以下のページを参考に

http://d.hatena.ne.jp/torutk/20100927/p1

64bit 化されているので 64bit アセンブラ(ml64.exe)がインストールされています。
それで 64bit アセンブラプログラミングに挑戦してみたくなりました。

まず、「ドキュメント ライブラリ」にフォルダ '64asm' を作り
そこにソースファイル test64.asm を以下のように作ります。
----
; サンプル x64 アセンブリー・プログラム

; Chris Lomont 2009 www.lomont.org

extrn ExitProcess: PROC ; システム・ライブラリーの外部関数

extrn MessageBoxA: PROC

includelib "user32.lib"

includelib "kernel32.lib"

.data

caption db "64びっと", 0

message db "いやっほーい", 0

.code

Start PROC

sub rsp, 28h ; シャドウ領域、スタックをアライメントする

mov rcx, 0

lea rdx, message

lea r8, caption

mov r9, 0

call MessageBoxA

mov ecx, eax

call ExitProcess

Start ENDP

End



; /entry:Start



; fastcall(新しい関数呼び出し規約)

; 引数はrcx、rdx、r8、r9、r10、r11

; 戻り値はrax

; 浮動小数点数の戻り値はxmm0

----
上のソースは
http://mbdev.hateblo.jp/entry/2013/05/14/212139
からコピーしたものです。(以下も参考にしました。)

そして同じ場所に以下の内容の 'test.bat' を作ります。(場合によってパスが違うかもしれません。)

----
"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\ml64.exe" test64.asm /link /subsystem:windows /entry:Start
----

そして「コマンドプロンプト」(windows のバージョンによって違うようなので検索してみてください。私のは windows 7 です)を立ち上げて

cd "C:\Users\[ユーザー名]\Documents\64asm"

と入力してみてください。エクスプローラーで直接辿っても構いません。
dir と入力してみて、先に作った2つのファイルがあればOKです。

そこでコマンドプロンプトから test と入力してみてください。
LINK : fatal error LNK1104: cannot open file 'user32.lib'
と user32.lib がないと怒られてしまいます。

そこで "C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64" から user32.lib を
64asm フォルダにコピーします。
そこでもう一度コマンドプロンプトから test と打ち込んで見てください。
今度は kernel32.lib がないと怒られてしまいます。
それでもういちど同じ場所からコピーしてきます。
そして test と入力してみてください。今度はうまくいったようです。
ためしに test64 と入力してみてください。メッセージボックスがあらわれるなら成功です。
あるいは test64.exe をクリックしてみてください。

付記:現在実行するとエラーが出るようです。目下調査中。
どうやら休止状態から復帰するとおかしくなるようです。

続きを読む »

2016年3月20日 (日)

クリックイベントのプロパティ?一覧

----
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset='UTF-8'>
</head>
<body>

<span id='t' style='color:blue; border-width:1px; border-style:solid;'>ここをクリック</span>

<div id='elements'></div>

<script type="text/javascript">
"use strict";
	var t = document.getElementById('t');
	var elements = document.getElementById('elements');

	t.onclick=click;

	function click(e){
		var	s='';

		for(var o in e){
			s+=o+' : '+e[o]+'<br />';
		}

		elements.innerHTML=s;
	}
</script>
</body>
</html>

----

ここをクリック

2016年3月19日 (土)

クリックしても反応しない。(FireFox)

しばらく前に買った「ゲームで学ぶ JavaScript 入門 HTML5&CSS も身につく!」と
いう本。大変勉強になるのだが 15puzzle が初期画像は出るのだが
数字をクリックしても何も反応が出ない。

私は普段 firefox を使っているのだが、他のブラウザ、IE11,opera12.18,
Google chrome (現最新バージョン) 49.0.2623.87 m (64-bit) では動くのだが
firefox (最新バージョン)45.0 でだけ全く反応がありません。

内容は初期化関数で

----        function init() {
            var table = document.getElementById("table");

            for (var i = 0 ; i < 4 ; i++) {
                var tr = document.createElement("tr");
                for (var j = 0 ; j < 4 ; j++) {
                    var td = document.createElement("td");
                    var index = i * 4 + j;
                    td.className = "tile";
                    td.index = index;
                    td.value = index;
                    td.textContent = index == 0 ? "" : index;
                    td.onclick = click;
                    tr.appendChild(td);
                    tiles.push(td);
                }
                table.appendChild(tr);
            }

            for (var i = 0 ; i < 1000 ; i++) {
                click({ srcElement: {index: Math.floor(Math.random() * 16)}})
            }
        }
----

というふうに数字の並んだ table を作って行き、数字の書かれた枠をクリックしたら
関数 click を呼び出すというもの。
で、その中身はどうなっているかというと、頭だけ引用すると
----

         function click(e) {
            var i = e.srcElement.index;

----

となっている。

でネットで散々調べた末に
「JavaScript - ブラウザ毎のイベント発生元取得テスト」
http://tsoft-web.com/sub/tips/event/
というページにたどりつき、「クリック後、大体こんな感じで取得」のサンプルページを
表示させ、「click me」と書かれた部分をクリックすると、
「e.srcElement = not exists」とあるではないか。

そこで上に引用した 15puzzle の2ヶ所の 'srcElement' を 'target' に
書き換えたところ、まともに動くようになった。
他のブラウザでもちゃんと動くようで解決した。

なお、srcElement にしか対応していないブラウザ上でも動かすには、上の一行を

            var i = (e.srcElement ||e.target).index;


とすればよいようだ。