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

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

ビット 1 をカウントする popcnt やエンディアンを変換する bswap など x64 の高機能なビット操作命令を C 言語から呼び出す (Windows, Visual C++)

x64 CPU には、64 ビットレジスタ内の ビット 1 の個数を数えたり、右端あるいは左端から最初にビット 1 が現れる位置を探したり、指定した位置のビットの値を一か所に集めたりする、高機能なビット操作命令があります。それらの命令を Visual C++ から呼び出してみます。C++ ではなく C 言語を使います。 動作確認環境 Windows 11 Home 23H2 Visual Studio Community 2022 (Visual C++) Intel Core i5-8265U […]

x64 アセンブリ言語で、Windows API や C 言語のライブラリを呼び出す .exe, .lib, .dll を開発する (Windows, MASM)

前回は簡単な x64 アセンブリ言語プログラムを作りました。今回は次のプログラムを作ります。 C 言語のライブラリや Windows の API を呼び出すプログラム (.exe) 足し算をするだけのスタティックライブラリ (.lib) C 言語のライブラリや Windows の API を呼び出すスタティックライブラリ (.lib) 足し算をするだけの DLL (.dll) C 言語のライブラリや Windows の API を呼び出す DLL (.dll) 使用するアセンブラは Visual […]

一番簡単な x64 アセンブリ言語プログラム (Windows, MASM)

固定値を返すだけの一番簡単な x64 アセンブリ言語プログラムを書いて、アセンブル・リンク・実行してみます。利用するアセンブラは Visual Studio に付属の 64bit 版 MASM(マイクロソフトマクロアセンブラ)です。 動作確認環境 Windows 11 Home 22H2 Visual Studio Community 2022 (MASM for x64) 6 行のアセンブリ言語プログラム 固定値 100 を返すだけの 6 行のシンプルなアセンブリ言語プログラムです。 「.co […]

何もしない長い命令、マルチバイト NOP (x86/x64)

x86/x64 CPU には、何もしないマシン語「90」(16進数)が存在します。アセンブリ言語でいうと「NOP」です。 では 2 バイト以上を何もしない命令でふさぎたい場合は「90」を繰り返せばいいのかというと、それでも構いませんが、 2 バイトの何もしないマシン語「66 90」 3 バイトの何もしないマシン語「0F 1F 00」 4 バイトの何もしないマシン語「0F 1F 40 00」 …… といった専用の命令が存在します。 こうした何もしない長い命令「マルチバイト NOP」について調べてみ […]

これは便利! Z80 マシン語コーディング用紙

「これは便利!」というのは冗談ですが、Z80 用のマシン語コーディング用紙(コーディングシート)が残っていたのでアップロードしておきます。 マシン語コーディング用紙 「マシン語コーディング用紙」の表紙です。1985 年ごろに町の電気屋で購入したものです。 「Addcom」というロゴから、アドコム電子株式会社製であることが分かります。下半分に書いてあるのは、当時普及していた 8bit CPU である Z80 のマシン語です。 シート本体です。 使い方はおおよそ次のようになります。 アセンブリ言語で […]