كيف يتم تبديل محتوى مسجل مع مسجل اخر بدون استخدام ايعاز
mov, xchg
كيف يتم تبديل محتوى مسجل مع مسجل اخر بدون استخدام ايعاز
mov, xchg
هاك مثالين بناء على ما ذكرت (بدون استخدام mov / xchg)
[color= #ff007f;]xor [color= #7f7f40;]eax[color= #0000ff;],[color= #7f7f40;]ebx [color= #ff007f;]xor [color= #7f7f40;]ebx[color= #0000ff;],[color= #7f7f40;]eax [color= #ff007f;]xor [color= #7f7f40;]eax[color= #0000ff;],[color= #7f7f40;]ebx
[color= #ff007f;]push [color= #7f7f40;]eax [color= #ff007f;]push [color= #7f7f40;]ebx [color= #ff007f;]pop [color= #7f7f40;]eax [color= #ff007f;]pop [color= #7f7f40;]ebx
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
شكرا على المجهود لكن هل يعمل هذين اللايعازين مع اسيمبلي 80*86
لدي تعقيب إضافي على موضوع عدم استخدام mov في العملية أن هذا الأمر يستوجب استخدام وسيط ثالث لأنك لا تستطيع استخدامه بين المسجلين المطلوبين مباشرة.
كمثال:
[color= #ff007f;]mov [color= #7f7f40;]ecx[color= #0000ff;],[color= #7f7f40;]eax [color= #ff007f;]mov [color= #7f7f40;]eax[color= #0000ff;],[color= #7f7f40;]ebx [color= #ff007f;]mov [color= #7f7f40;]ebx[color= #0000ff;],[color= #7f7f40;]ecx
بالتالي إن كان المطلوب من خلال سؤالك أيضاً عدم استخدام وسيط ثالث فعليك أن تقوم باستخدام طريقة XOR فقط وتصبح الطريقة الثانية غير صحيحة لأنك تعتمد على المكدس كوسيط ثالث.
تم تعديل هذه المشاركة بواسطة Xacker في 7 فبراير 2009 في 20:21
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
الله يعطيك العافية والف شكرا كنت محتاجة هذه الاجابة وشكرا لكل الجهد والدعم اللي بيتوفر في هذا المنتدى الرائع
والف شكرا مرة ثانية
add ax,bx
sub bx,ax
sub ax,bx
هذا هو الحل الصحيح لانه لو فرضنا ان قيمة ax:20,bx:10 بالخطوة الاولى يصيح قيمة ax:30 عندما اقوم بطرح 30-10=20 وهكذا اصبحت قيمة المسجل bx=20 وفي الخطوة الاخيرة عندما اطرح 20-30=10 ,وهي القيمة المطلوب وضعها في المسجلax=10وهكذا تم تبديل القيم بدون استخدام ايعاز mov,xchg
اقتباسهذا هو الحل الصحيح لانه لو فرضنا ان قيمة ax:20,bx:10 بالخطوة الاولى يصيح قيمة ax:30 عندما اقوم بطرح 30-10=20 وهكذا اصبحت قيمة المسجل bx=20 وفي الخطوة الاخيرة عندما اطرح 20-30=10 ,وهي القيمة المطلوب وضعها في المسجلax=10وهكذا تم تبديل القيم بدون استخدام ايعاز mov,xchg
استخدام xor هو الأفضل, لأن طريقتك يمكن أن تؤدي إلى overflow :)
ليس هناك overflow ، كل ما فى الأمر ان carry Flag ستكون 1Khaled.Alshaya كتب:استخدام xor هو الأفضل, لأن طريقتك يمكن أن تؤدي إلى overflow :)
لكن الطريقه صحيحه والناتج صحيح فى جميع الاحوال
ax = 1
bx = 0FFFFh
أخبرني بعد تنفيذ هذا ماذا سيكون قيمة ax, bx :)
add ax,bx sub bx,ax sub ax,bx
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
كودك غير مضبوط اساساXacker كتب:ax = 1bx = 0FFFFh
أخبرني بعد تنفيذ هذا ماذا سيكون قيمة ax, bx :)
add ax,bx sub bx,ax sub ax,bx
صحح الكود كالتالى ثم أخبرني بعد تنفيذ كل ما تريد ماذا سيكون قيمة ax, bx :)
add ax,bx sub bx,ax neg bx sub ax,bx
شاااو
تم تعديل هذه المشاركة بواسطة NawalyZuma في 15 فبراير 2009 في 15:59
وبالتالي كان من الأفضل أن تكتبه في الرد السابق طالما أردت أن تؤكد أنه من الصحيح استخدام add / sub
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
أنا لم أكتب شيئ
انا علقة على رد Khaled.Alshaya
وهذا الرد لا يحتوى على أى كود
ثم بعد ذلك أنت طرحت الكود غير المضبوط
ولم تخبرنى
شاااواقتباسأخبرني بعد تنفيذ كل ما تريد ماذا سيكون قيمة ax, bx
اقتباسانا علقة على رد Khaled.Alshayaوهذا الرد لا يحتوى على أى كود
ثم بعد ذلك أنت طرحت الكود غير المضبوط
و منكم نستفيد :)
العفو ... أنت من ذو المقالات المميزة فى المنتدى، وانا من استفدت كثيراً من مقالات فى قسم السى، حقيقة مقالات رائعة، اعجبنى جداً موضوع الجديدة في لغة C++0xKhaled.Alshaya كتب:و منكم نستفيد :)
المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية
جارٍ التحقق من المتواجدين…