2012-08-06 34 views
5

जब nasm के साथ इस कोड कोडांतरण:"mov rax, 0x1" के बजाय हमेशा "mov eax, 0x1" का उपयोग किया जा सकता है?

b8 01 00 00 00 b8 01 00 00 00 

जो है mov eax, 0x1 के लिए opcode दो बार दोहराया:

BITS 64 
mov eax, 0x1 
mov rax, 0x1 

मैं इस उत्पादन मिलता है।

इसका मतलब यह है कि mov rax, 0x1हमेशाmov eax, 0x1 द्वारा बदला जा सकता है या यह सिर्फ इस मामले में है?

यदि यह सही यह तुलना में उपयोग करने के लिए बेहतर नहीं होगा है: जब इकट्ठे जबकि mov eax, 0x1 केवल 5 बाइट्स

xor rax, rax 
inc rax 
कि 6 बाइट्स हो जाता है के रूप में

?

+0

प्रासंगिक: http://stackoverflow.com/questions/8502839/loading-small-numbers-into-64-bit-x86-registers –

+4

असल में, क्योंकि पहला स्निपेट सही है, दूसरा स्निपेट केवल 4 बाइट्स लेगा (कोई आरईएक्स उपसर्ग आवश्यक)। – harold

+0

'xor eax, eax' /' inc eax' 4B है, 'mov eax, 1' से थोड़ा छोटा है। लेकिन तब तक इसका उपयोग न करें जब तक कि आप कोड-आकार के लिए अत्यधिक अनुकूलित नहीं होते। एक निर्देश (और एक फ़्यूज्ड-डोमेन यूओपी) को सहेजने के लिए 1 बाइट खर्च करना आधुनिक CPUs के लिए इसके लायक है। –

उत्तर

5

हमेशा। अधिकांश (यदि नहीं सभी) 32-बिट एमओवी और एएलयू ऑपरेशंस गंतव्य रजिस्टर ऑपरेंड के 32 से 63 के बीच बिट्स साफ़ करते हैं। विवरण के लिए सीपीयू मैनुअल देखें।