كيفية ترجمة "pushl 2000" من AT & T ASM إلى بناء جملة Intel على i386
سؤال
أحاول ترجمة ما يلي من الجمعية 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]