10

これを 10 年前 ( Intel MPXbnd0..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 noprefixMASM に似た構文を使用するモードでも)。

関連: 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 Haswellandがサポートされ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されますが、オペランドとして使用するとすぐに問題が発生することに注意してください。

4

1 に答える 1