C++とアセンブラー⑦

C++アセンブラーで開発した関数について一通り解説してきた。今回は、戻り値を持つ関数の説明を行う。

続きを読む

C++とアセンブラー⑥

C++アセンブラーで開発した関数について一通り解説してきた。今回は、スタックへレジスターの保存を行うだけでなく、スタックに作業領域を割り当てて使う方法を紹介する。レジスターの保護と、作業領域確保の両方を行う例を紹介する。

続きを読む

C++とアセンブラー⑤

C++アセンブラー④で紹介したように、xmmレジスターを保護しただけでは、ymmレジスターやzmmレジスターの保護が保証されないことが分かった。そこで、ここでは512ビットのSIMDをサポートしたCPUはzmmレジスターを、256ビットのSIMDをサポートしたCPUはymmレジスターを保護する例を示す。併せて、mov命令へ適切なアライメントを保証できるとは限らないので、アライメントを要求しない命令に書き換える。

続きを読む

C++とアセンブラー④

Visual StudioC++が呼び出すアセンブリ関数でレジスターを保護する方法を紹介したが、xmmレジスターまでしか考慮していない。ymmレジスターやzmmレジスターを搭載したCPUで、本当にxmmレジスターをほごするだけで良いのか考察してみる。

続きを読む

C++とアセンブラー③

Visual StudioC++からアセンブリコードで記述した関数を紹介したが、レジスターの退避が十分とは言えませんので、破壊してはならないレジスターを保護する例を紹介する。

続きを読む

C++とアセンブラー②

Visual Studio でプラットフォームにx64 を選ぶとインラインアセンブラを使用できない。理由はスタックやレジスターの管理など、いろいろ考えられる。インラインアセンブラを使用できないということは、アセンブリコードは別のファイルに単独で記述しなければならない。以降に、64 ビット環境で直接アセンブリコードを記述する手順を示す。本プログラムの機能は、インラインアセンブラで書いたものと同様である。

続きを読む