コミット済みメモリとは何か。メモリ使用量と何が違うのか。(Windows)

タスクマネージャーに表示される「コミット済み」メモリとは何でしょうか。「メモリ使用量」と何が違うのでしょうか。簡単なプログラムを作って、メモリの使用状況を観察してみます。 動作確認環境 Windows 11 Home 24H2 Visual Studio Community 2022 (Visual C++) 「コミット済み」メモリとは タスクマネージャーの[パフォーマンス]タブ内の[メモリ]には、「コミット済み」の文字の下に 2 つの数字が表示されています。「/」の左側が「コミットチャージ」( […]

掛け算を imul 命令を使わずに高速に計算する (x86/x64)

x86/x64 には掛け算命令(mul, imul)がありますが、あえてほかの命令を使って掛け算と同等の処理を行うことがあります。たとえば、x64 の rax レジスタの値を 5 倍するのに、imul rax, rax, 5 ではなく、lea rax, QWORD PTR [rax+rax*4] とすることがあります。このほうが高速だからです。ほかの倍数についても見てみましょう。 動作確認環境 Windows 11 Home 24H2 Visual Studio Community 2022 ( […]

2 台の PC を USB デバッグケーブルで接続してカーネルデバッグする方法 (Windows)

以前、「WinDbg のカーネルデバッグで使える USB 3.0 ケーブルを秋葉原で買った部品で作る」という記事を書きました。今回は、その USB ケーブルで 2 台の PC を接続し、WinDbg でカーネルデバッグを開始するまでの手順を記述します。ただし、詳細は環境によって差異があると思います。一例としてご覧ください。 動作確認環境 Dell Inspiron 13 5390(2019 年購入), Windows 11 Home 24H2 Dell Inspiron 13 7370(2018 […]

x86 アセンブリ命令ランキング ベスト 1000

x86 のよく使われる命令を調べてみました。調査対象は Windows の SysWOW64 ディレクトリに入っている 32bit モジュールです。(x86 版ではなく x64 版の一覧はこちらです。) 動作確認環境 Windows 11 Home 24H2 Visual Studio Community 2022 (Visual C++) x86 のよく使われる命令 では早速ランキングです。ベスト 1000 と書きましたが、実際は 1041 個です(最下位タイのため順位としては 865 位まで […]

x64 アセンブリ命令ランキング ベスト 1000

x64 のよく使われる命令を調べてみました。調査対象は Windows の System32 ディレクトリに入っている 64bit モジュールです。(x64 版ではなく x86 版の一覧はこちらです。) 動作確認環境 Windows 11 Home 24H2 Visual Studio Community 2022 (Visual C++) x64 のよく使われる命令 では早速ランキングです。ベスト 1000 と書きましたが、1000 個を少し超えています。長いです。 順位 命令 個数 割合 累 […]

割り算の商と余りを同時に計算する(x86, x64, C言語)

「割り算の商と余りを同時に計算する」と書きましたが、特別な方法を使うわけではありません。x86/x64 の割り算命令は商と余り(剰余)の両方を同時に計算してくれます。 動作確認環境 Windows 11 Home 24H2 Visual Studio Community 2022 (Visual C++) x86/x64 の割り算命令 x86/x64 アセンブリ言語の割り算命令は div(符号なし)または idiv(符号付き)です。Intel のドキュメントから div と idiv の表を引用 […]

x64 呼び出し規約のシャドウストアは何に使われるのか (Windows)

x64 呼び出し規約には、呼び出し元が確保した 32 バイトのスタック(シャドウストア、シャドウスペース、シャドウ領域、ホームスペース)を呼び出し先が使うというちょっと変わったルールがあります。このシャドウストアは実際に何に使われるのか、いろいろなサンプルプログラムを作って調べてみます。なお、x64 の呼び出し規約やシャドウストアについては、以前の記事 [1] をご覧ください。 動作確認環境 Windows 11 Home 23H2 Visual Studio Community 2022 (V […]

レジストリのトランザクション機能を使ってユーザー名とパスワードを同時に書き込む (Windows)

あまり知られていないと思いますが、レジストリはトランザクション処理が可能です。たとえば、レジストリに対してユーザー名とパスワードの書き込みを指示した後、コミットして両方を同時に確定したり、ロールバックして取り消したりできます。実際に試してみましょう。 動作確認環境 Windows 11 Home 23H2 Visual Studio Community 2022 (Visual C++) トランザクション処理の書き方 トランザクション処理を行うには、まず、CreateTransaction 関数 […]

x64 呼び出し規約をわかりやすく説明してみる (Windows)

マイクロソフトのサイト [1] に Windows の x64 呼び出し規約 (calling convention) の公式説明がありますが、網羅性と正確さを重視したためか、機械翻訳が使われているためか、少々わかりにくいところがあります。そこで、ポイントを絞ってできるだけわかりやすく説明してみたいと思います。 動作確認環境 Windows 11 Home 23H2 Visual Studio Community 2022 (Visual C++) Rust 1.81.0 ルール 1. 関数呼び […]

WinDbg: 条件付きブレークポイントで「ある関数を経由してきたか」をチェックする方法

条件付きブレークポイント (Conditional Breakpoint) では、よく「引数や変数がある値になっているか」をチェックしますが、「ある関数を経由してきたか」はどうやってチェックすればいいのでしょうか。 動作確認環境 Windows 11 Home 23H2 Visual Studio Community 2022 (Visual C++) WinDbg 10.0 「ある関数を経由してきたか」とは 下図のように、関数 common に至るルートが 4 通りあったとします。 単純に関数 […]