الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

لماذا لا يمكننا كتابة LES AX,SP

بدأه مصطفى 36a2 في 10 ديسمبر 2013 · 3 رد · 1,076 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

ضمن أحد البرامج وجدت التعليمة C4C4 والتي تكافئ

LES     AX,SP

ولكن عندما حاولت كتابتها اعتبرها تعليمة خاطئة !

أما عند الكتابة في الذاكرة فوراً C4C4 يقوم بقراءتها على أنها

LES     AX,SP

وسؤالي من شقين :

1- لماذا يعتبرها خاطئة ؟

2- اذا كانت خاطئة لماذا ينفذها ؟

 

والله ولي التوفيق

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 10 ديسمبر 2013 في 21:41

#2
اقتباس
ضمن أحد البرامج وجدت التعليمة C4C4 والتي تكافئ

أعتقد انك تقصد 8B C4 و ليس C4 C4 حيث الأخيره تعنى أمر أخر لا علاقة له بـ mov.

 

أولا القيمه 8B C4 هى صحيحه سواء استخدمتها كـ Opcode او Instruction المقابلة لها.

 

تذكر أن قيمة المسجلات داخل 16 بت هى نفسها داخل 32بت و بالتالي كتابتك لـ 8B C4 داخل 32بت ستنتج:

MOV EAX, ESP

و ليس

MOV AX, SP

و لإنتاج الأخيره داخل 32بت لابد من إستخدام اللاحقه 66 للتعبير عن تغيير حجم المدخلات لـ 16بت لتصبح النتيجه:

66 8B C4 mov ax, sp

يمكنك مراجعة الموقع ref.x86asm.net الذى يحتوى على خرائط لأغلب الـ opcodes و الـ instructions.

 

 

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#3

جزاك الله خيراً أخي C++er

أحاول الغوص في أسمبلي 16 وأستعمل debug في ويندوز لذلك كل البيئة حولي 16 بت ..

لا أخفيك .. فقد كنت أحاول تتبع مقاطعة البيوس رقم 10 ... المهم .. هذه صورة من قلب الحدث ..

C:\Users\Mostafa36a2>debug
-a
13E6:0100 int 10
13E6:0102
-t

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFE8  BP=0000  SI=0000  DI=0000
DS=13E6  ES=13E6  SS=13E6  CS=020E  IP=08BD   NV UP DI PL NZ NA PO NC
020E:08BD 2E            CS:
020E:08BE 803EBB0802    CMP     BYTE PTR [08BB],02                 CS:08BB=00
-t

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFE8  BP=0000  SI=0000  DI=0000
DS=13E6  ES=13E6  SS=13E6  CS=020E  IP=08C3   NV UP DI NG NZ AC PO CY
020E:08C3 7505          JNZ     08CA
-t

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFE8  BP=0000  SI=0000  DI=0000
DS=13E6  ES=13E6  SS=13E6  CS=020E  IP=08CA   NV UP DI NG NZ AC PO CY
020E:08CA 2E            CS:
020E:08CB 803EBB0801    CMP     BYTE PTR [08BB],01                 CS:08BB=00
-t

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFE8  BP=0000  SI=0000  DI=0000
DS=13E6  ES=13E6  SS=13E6  CS=020E  IP=08D0   NV UP DI NG NZ AC PE CY
020E:08D0 745D          JZ      092F
-t

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFE8  BP=0000  SI=0000  DI=0000
DS=13E6  ES=13E6  SS=13E6  CS=020E  IP=08D2   NV UP DI NG NZ AC PE CY
020E:08D2 80FC00        CMP     AH,00
-t

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFE8  BP=0000  SI=0000  DI=0000
DS=13E6  ES=13E6  SS=13E6  CS=020E  IP=08D5   NV UP DI PL ZR NA PE NC
020E:08D5 7430          JZ      0907
-t

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFE8  BP=0000  SI=0000  DI=0000
DS=13E6  ES=13E6  SS=13E6  CS=020E  IP=0907   NV UP DI PL ZR NA PE NC
020E:0907 2E            CS:
020E:0908 C606BC0801    MOV     BYTE PTR [08BC],01                 CS:08BC=01
-t

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFE8  BP=0000  SI=0000  DI=0000
DS=13E6  ES=13E6  SS=13E6  CS=020E  IP=090D   NV UP DI PL ZR NA PE NC
020E:090D C4C4          LES     AX,SP
-

عذراً سامحني ... قصدت التعليمة LES     AX,SP

سأعدل العنوان ونص السؤال ...

______________

نتابع ..

التعليمة السابقة يتم بعد تنفيذه مباشرة الانتقال إلى وضعية أخرى للشاشة ..

ولم أفهم المغزى !!! أين هو التغيير ؟ لم أر أي تغيير فعلي يؤدي لذلك ..

فما رأيك ؟

#4

الإجابة كانت في StackOverflow بأن التعليمة les ax,sp غير صحيحة وبأن الخطأ من الـdisassembler الخاص بـ debug.com

وبأن التتبع كله خاطئ لأننا في protected mode

مواضيع مشابهة