كيفية ترجمة "pushl 2000" من AT & T ASM إلى بناء جملة Intel على i386

StackOverflow https://stackoverflow.com/questions/1710171

سؤال

أحاول ترجمة ما يلي من الجمعية AT & T إلى Intel Community:

pushl 2000

الآن هذا يجمع إلى:

ff 35 d0 07 00 00       pushl  0x7d0

ولكن بغض النظر عن ما أحاوله، لا أستطيع الحصول على نفسه في شنع إنتل، لقد حاولت:

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

لذلك أنا خارج القرائن، ما هو ما يعادل "pushl 2000"؟

هل كانت مفيدة؟

المحلول

أعتقد أن الكود الأصلي لا يفعل ما تعتقد أنه يفعله. وفقا ل 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 بادئة تشير إلى أنك تعني حقا القيام بالوصول إلى الذاكرة هناك.

نصائح أخرى

بالنسبة لي، في GNU Assembler 2.18، لهدف 32 بت

.intel_syntax
push dword [2000]

يولد:

0:   ff 35 d0 07 00 00       pushl  0x7d0

ولل NASM:

push dword [dword 2000]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top