i386

2009-11-10 11 views
6

मैं एटी & टी विधानसभा से इंटेल विधानसभा के लिए निम्न अनुवाद करने के लिए कोशिश कर रहा हूँ पर इंटेल वाक्य रचना करने के लिए एटी एंड टी एएसएम से अनुवाद करने का तरीका "pushl 2000":i386

:

pushl 2000 

अब इस के लिए नीचे संकलित

ff 35 d0 07 00 00  pushl 0x7d0 

लेकिन कोई फर्क नहीं पड़ता कि मैं क्या करने की कोशिश, मैं इंटेल synax में एक ही नहीं मिल सकता है, मैं कोशिश की है:

intel asm 
disassembly after compiling to at&t 

push 2000 
68 d0 07 00 00   push $0x7d0 

push [2000] 
68 d0 07 00 00   push $0x7d0 

push dword ptr [2000] 
68 d0 07 00 00   push $0x7d0 

push dword ptr 2000 
68 d0 07 00 00   push $0x7d0 

तो मैं सुराग से बाहर हूं, "पुशल 2000" के बराबर क्या है?

उत्तर

7

मुझे लगता है कि मूल कोड नहीं कर रहा है आप क्या सोचते हैं यह कर रहा है। disassembly msdev के अनुसार है:

003AFCFC FF 35 D0 07 00 00 push  dword ptr ds:[7D0h] 

कौन सा धक्का के बराबर है:

*((DWORD*)2000) 

नहीं ढेर पर मूल्य 2000 धक्का। हालांकि - यह है कि यदि वास्तव में आप क्या चाहते हैं तो अनुदेश है:

push dword ptr ds:[2000] 

ds:ds खंड रजिस्टर का उपयोग करने के एक संकेत है। सेगमेंट रजिस्ट्रार खराब 16-बिट दिनों से होल्ड-ओवर हैं। प्रमुख हैं cs कर रहे हैं - कोड खंड, ds - डेटा खंड और ss - ढेर खंड (और fs है जो जहां धागा स्थानीय लोगों जमा हो जाती है)। उन्हें स्मृति में आधार ऑफसेट के रूप में सोचें। डिफ़ॉल्ट डेटा एक्सेस ds सेगमेंट से बाहर हैं।

क्यों push dword ptr [2000] काम नहीं किया है के रूप में मेरा अनुमान है कि संकलक महसूस किया कि कि एक मूर्खतापूर्ण बात आप का उपयोग करें और यह तय 'करने के लिए किया गया है। ds उपसर्ग का उपयोग करने के लिए मजबूर करके आप इंगित करते हैं कि आप वास्तव में स्मृति एक्सेस करने का मतलब रखते हैं।

+0

है वास्तव में लगता है कि होना करने के लिए सही अनुवाद मैं नहीं कह सकता कि मैं मूल कोड को बहुत अच्छी तरह समझता हूं (न ही मैं वास्तव में चाहता हूं), लेकिन मैं इसे इंटेल सिंटैक्स में अनुवाद करना चाहता हूं। क्या आप समझा सकते हैं कि "डीएस:" कहां से आ रहा है? –

+0

ठीक है - मैंने उत्तर में 'डीएस' का थोड़ा विवरण जोड़ा है। – Aaron

+0

क्या आपको पता है कि मैं इस तरह चालाक होने की कोशिश न करने के लिए कैसे प्राप्त कर सकता हूं? –

1
मेरे लिए

, जीएनयू कोडांतरक 2.18, 32-बिट लक्ष्य के लिए में

.intel_syntax 
push dword [2000] 

उत्पन्न करता है:

0: ff 35 d0 07 00 00  pushl 0x7d0 

और एनएएसएम के लिए:

push dword [dword 2000] 
+0

वही कोड मेरे लिए यह उत्पन्न करता है "0: \t 68 डी 4 07 00 00 \t धक्का $ 0x7d4" 2.20 पास करने के रूप में --32। –

संबंधित मुद्दे