assembly - नए NASM संस्करणों में नए नाम के साथ प्रतीक नाम का विरोध?



x86 naming (1)

कल्पना करो कि आपने यह 10 साल पहले लिखा था ( इंटेल bnd0 और 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 के एक मौजूदा संस्करण के साथ इसे कैसे इकट्ठा कर सकते हैं? यानी क्या एनएसएम (या वाईएएसएम) नए संस्करणों के साथ आगे संगतता है जो नये रजिस्टर नामों का समर्थन करते हैं?

जाहिर है यह एक फ़ाइल या परियोजना के अंदर खोज / प्रतिस्थापित करने के साथ हल करना आसान है। लेकिन सिद्धांत रूप में, आपके पास लाइब्रेरी ABI के एक भाग के रूप में एक वैश्विक वैरिएबल नाम हो सकता है, जो कि आप या तो एनएसएम से निर्यात करते हैं या एनएसएम में extern ymm0 साथ आयात करना extern ymm0 । (बाहरी प्रतीकों को घोषित किया जाना है, इसलिए अज्ञात पंजीकरण नाम प्रतीक संदर्भों में कभी नहीं इकट्ठा होते हैं।)

NASM वाक्यरचना प्लेटफ़ॉर्म पर सी संकलक आउटपुट के प्रारूप के रूप में पहले से अनुपयुक्त है, जो प्रतीक नामों को एक _ साथ प्रीफिक्स नहीं करते हैं या किसी अन्य प्रकार के नाम mangling (जैसे Linux ELF) करते हैं। आप एक वैश्विक int eax = 1; संकलित नहीं कर सकते int eax = 1;यही कारण है कि एटी एंड टी वाक्यविन्यास रजिस्टर नामों के लिए %eax का उपयोग करता है । इस उत्तर पर टिप्पणी में चर्चा इस सवाल को प्रेरित करती है। ध्यान दें कि गैस को बाहरी प्रतीकों की आवश्यकता नहीं है; अपरिचित नामों को प्रतीकों के रूप में माना जाता है (यहां तक ​​कि .intel_syntax noprefix मोड में जो कि एक .intel_syntax noprefix समान सिंटैक्स का उपयोग करता है)।

संबंधित: नए एक्सटेंशन के लिए MASM संसाधित करने के लिए स्रोत कैसे संभालता है?

आप किसी भी तरह से एमपीएक्स समर्थन अक्षम कर सकते हैं?

YASM एक CPU निर्देश का समर्थन करता है जो आपको कुछ मेमोनेक्स के लिए समर्थन को अक्षम करने देता है, लेकिन AVX समर्थन को अक्षम करने से आपको एक प्रतीक नाम के रूप में ymm0 उपयोग नहीं करने देता है। (YASM 1.3.0 AVX512 या MPX का समर्थन नहीं करता है, इसलिए यह उन कोडों को इकट्ठा कर सकता है जो उन नामों को प्रतीक के रूप में उपयोग करता है, लेकिन यह AVX2 का समर्थन करता है।)

CPU Conroe
extern ymm0

मुझे yasm-CPU.asm:2: error: directive 'extern' requires an identifier parameter I या ymm0: dd 123 साथ ymm0: dd 123 , त्रुटि है yasm-CPU.asm:2: error: label or instruction expected at start of line

लेकिन एवीएक्स का समर्थन निश्चित रूप से अक्षम है: CPU Conroe vmovaps xmm0, [edi] / 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 या पुराने अक्षम एक्सटेंशन के समान है।) आईडीसी क्यों यह in CPU Sandybridge AVX ऐसा नहीं कहता in CPU Sandybridge AVX । ऐसा लगता है कि यूजएम 1.3.0 CPU Haswell और 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 निर्देश के बिना या इसके ठीक बिना इकट्ठा करता है, लेकिन जैसे ही आप इसे ऑपरेंड के रूप में उपयोग करते हैं, आपको एक समस्या है।


NASM आपको डॉलर के हस्ताक्षर $ साथ प्रतीकों को उपसर्ग देता है ताकि इसे रजिस्टर या अन्य आरक्षित शब्द के बजाय प्रतीक के रूप में समझा जा सके। NASM दस्तावेज़ से :

3.1 एक NASM स्रोत रेखा का लेआउट

[...] एक पहचानकर्ता को यह भी संकेत मिलता है कि यह एक पहचानकर्ता के रूप में पढ़ा जाने का इरादा है और एक आरक्षित शब्द नहीं है। इस प्रकार, यदि आप किसी अन्य मॉड्यूल के साथ लिंक कर रहे हैं जिसे eax नामक एक प्रतीक को परिभाषित किया गया है, तो आप रजिस्टर से प्रतीक को भेद करने के लिए NASM कोड में $eax उल्लेख कर सकते हैं। [...]

आम तौर पर एमएएसएम वातावरण में प्रयोग किया जाता है जहां सी कंपाइलर उपसर्ग पहचानकर्ताओं को अंडरस्कोर _ साथ होता है, इसलिए यह उस एंबेबलर के साथ एक बड़ा मुद्दा नहीं है। हालांकि इसका समाधान इस समस्या का है, लेकिन यह मूल रूप से NASM के विपरीत है। आप अपनी पसंद के आरक्षित शब्द को अक्षम करने के लिए OPTION NOKEYWORD निर्देश का उपयोग कर सकते हैं। उदाहरण के लिए आप OPTION NOKEYWORD:<eax> उपयोग कर सकते हैं ताकि आप OPTION NOKEYWORD:<eax> नाम के प्रतीक का उपयोग कर सकें। निश्चित रूप से आपको ईएक्स नामक रजिस्टर का उपयोग करने से रोकता है, इसलिए यह NASM के सामान्य समाधान के रूप में नहीं है।





forward-compatibility