2011-12-15 13 views
6

कहते हैं कि मैं 64 बिट मोड में पूर्ण पते gs:$30 से पढ़ने के लिए चाहते हैं, तो एएसएम कोड तरह दिखता है:कैसे डेल्फी XE2 में पूर्ण पते का डेटा पढ़ने की

asm 
    mov rax, gs:[$30] 
end; 

... और संकलक इस का अनुवाद कोड के लिए ...

65 48 8B 05 30 00 00 00  mov rax,gs:[rel $00000030] 

लेकिन मैं रिश्तेदार का पता (rip + $30) उपयोग करने के लिए नहीं करना चाहती। मैं संकलक पूर्ण पते का उपयोग और इस तरह से संकलित करने के लिए करना चाहते हैं:

65 48 8B 04 25 30 00 00 00 mov rax,gs:[+$0030] 

मैं यह करने के लिए कैसे करते हैं (यह है कि अगर मैं gs: उपसर्ग का उपयोग करें या नहीं, एक ही है!)?

संपादित करें:

मैं के लिए काम के आसपास पता है। मैं पूछता हूं कि कंपाइलर को जगह को संबोधित करने के लिए कॉम्प्लेयर को बताने के लिए कोई कॉमंड मौजूद है या नहीं।

संपादित

अब तक तो अच्छा ... :)

drhirsch मुझे आदेश को खोजने के लिए मदद की है, और अब संकलक अनुवाद:

mov rax, gs:[abs qword ptr $30] 
or 
mov rax, gs:[abs $30] 
इस के लिए

:

6548A13000000000000000 mov rax,[qword $0000000000000030] 

जो एलएम है ठीक है :) क्योंकि मुझे छोटा 32 बिट ऑपोड (ऊपरी ऑपकोड दिखाना) लंबा 64 बिट ऑपोड स्थापित करना चाहते हैं।

क्या संकलक को कम 32 बिट एड्रेस ओकोड का उपयोग करने के लिए कहने का कोई तरीका है?

+0

साथ संबोधित कर रहा है, सिर्फ एक अनुमान हाथ में कोई 64-बिट डेल्फी है में सक्षम हो सकता है - शाब्दिक मूल्य के बजाय रजिस्टर का उपयोग करें: 'mov RAX, $ 30; mov RAX, जीएस: [आरएक्स] ' – kludg

+0

@ सर्ग: निश्चित रूप से, लेकिन यह एक काम-आसपास है! मैं पूछता हूं कि कंपाइलर को जगह को संबोधित करने के लिए कॉम्प्लेयर को बताने के लिए कोई कॉमंड मौजूद है या नहीं। –

+0

आपने यह क्यों नहीं पूछा कि पहले स्थान पर – hirschhornsalz

उत्तर

4

आपको movabs निर्देश का उपयोग करने की आवश्यकता है।

movabs rax, gs:[$30] 

संपादित करें: को संबोधित रिश्तेदार चीर डिफ़ॉल्ट मोड, कुछ अस्सेम्ब्लेर्स पर आप 32 बिट पूर्ण मजबूर करने के लिए

mov rax, gs:[dword $30] #nasm, tasm 
mov rax, gs:[abs $30] #yasm 
+0

हम्म, लेकिन कंपाइलर जोर देते हैं: '[डीसीसी त्रुटि] Project1.dpr (20): ई 2003 अविकसित पहचानकर्ता:' movabs ' –

+0

और अन्य दो तरीकों के लिए जोर देते हैं:' [डीसीसी त्रुटि] Project1.dpr (21): E2105 इनलाइन असेंबलर वाक्यविन्यास त्रुटि' –

+0

सही तरीका है Thanx: 'mov rax, gs: [abs qword ptr addr] 'लेकिन कंपाइलर लंबे 64 बिट ऑपोड का उपयोग करता है जो 32 बिट ओपोड को छोटा करता है। कुछ पता है इसे कैसे हल करना है? –

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