これを 10 年前 ( Intel MPXとbnd0
..bnd3
レジスターがロードマップに含まれる前) に書いたとします。
section .data
; define some globals which are part of an ABI so you can't just rename them
global bnd0 ; MPX bound register name conflict
bnd0: dd 123
global k0 ; AVX512 mask register name conflict
k0: dq 12345
これを現在のバージョンの NASM でどのように組み立てることができますか? つまり、NASM (または YASM) には、新しいレジスタ名をサポートする新しいバージョンとの前方互換性がありますか?
明らかに、これは単一のファイルまたはプロジェクト内で検索/置換することで簡単に解決できます。しかし、理論的には、NASM からエクスポートするか、extern ymm0
. (外部シンボルを宣言する必要があるため、認識されないレジスタ名がシンボル参照にアセンブルされることはありません。)
_
NASM 構文は、シンボル名の前に を付けたり、他の種類の名前マングリングを実行したりしないプラットフォーム (Linux ELF など) では、C コンパイラ出力の形式として既に不適切です。global をコンパイルすることはできませんint eax = 1;
。 これが、AT&T 構文が%eax
レジスタ名に使用する理由です。その答えに関するコメントでの議論が、この質問に影響を与えたものです。GAS は外部シンボルを宣言する必要がないことに注意してください。認識されない名前はシンボルとして扱われます ( .intel_syntax noprefix
MASM に似た構文を使用するモードでも)。
関連: MASM は新しい拡張機能の前方ソース互換性をどのように処理しますか?
どうにかして MPX サポートを無効にすることはできますか?
YASM は、一部のニーモニックのサポートを無効にするCPU
ディレクティブymm0
をサポートしていますが、AVX サポートを無効にしても、シンボル名として使用することはできません。(YASM 1.3.0 は AVX512 または MPX をサポートしていないため、これらのレジスタ名をシンボルとして使用するコードをアセンブルできますが、AVX2 はサポートしています。)
CPU Conroe
extern ymm0
私は得るyasm-CPU.asm:2: error: directive 'extern' requires an identifier parameter
。またはymm0: dd 123
、エラーはyasm-CPU.asm:2: error: label or instruction expected at start of line
しかし、AVX サポートは確実に無効になっています: アセンブルCPU Conroe
/vmovaps xmm0, [edi]
を与える:
$ yasm -Worphan-labels -felf32 yasm-CPU.asm
yasm-CPU.asm:2: warning: `vmovaps' is an instruction in CPU
yasm-CPU.asm:2: error: instruction expected after label
(CPU 686
古い無効化された拡張機能については、または同様のように表示されます。IDK なぜ表示されないin CPU Sandybridge AVX
のですか。yasm は適切に保守されていないようです。YASM 1.3.0ではCPU Haswell
andがサポートされAVX2
ていますが、ドキュメントには記載されていません。)
この機能の目的は、SSSE3 以下の CPU の関数で誤って SSE4 命令を使用するのを防ぐことですが、明らかにこの問題には役立たないでしょう。
NASM のCPU
ディレクティブは似ているようで、まったく役に立ちません。
CPU 686
vmovaps xmm0, [edi]
extern ymm0
mov eax, ymm0
$ nasm -Worphan-labels -felf32 CPU.asm
CPU.asm:2: error: no instruction for this cpu level
CPU.asm:4: error: invalid combination of opcode and operands
extern ymm0
ディレクティブの有無にかかわらず問題なくアセンブルCPU
されますが、オペランドとして使用するとすぐに問題が発生することに注意してください。