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

[ تمت الإجابة ]نسخ القيم من الذاكره من اليمين لليسار

بدأه C++er في 27 فبراير 2010 · 3 رد · 856 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

قمت بكتابة هذه الداله

;***********************************************;
; Proc Name   : MemoryCopyB
;
; Description : copy block of memory from src
;               to dest using specified length.
;
; Parameters  :
;
;     Dest : destination memory to copy to.
;     Src  : source memory to copy from.
;     Len  : number of bytes to copy.
;
; Return      : None
;***********************************************;

MemoryCopyB PROC, Dest:PTR DWORD, Src:PTR DWORD, Len:DWORD

push esi         ; save esi
push edi         ; save edi
mov  ecx, Len    ; put length in ecx
mov  esi, Src  ; put source address in edi
mov  edi, Dest ; put destination address in edi
rep  movsb       ; repeat copy until ecx is zero
pop  edi         ; restore edi
pop  esi         ; restore esi
ret

MemoryCopyB ENDP

الداله دى بتنسخ عدد معين من البايت (مسجل فى Len) من Src إلى Dest.

عملية النسخ تتم من اليسار لليمين بمعنى ان لو عندنا النص "12345" (كل رقم مسجل فى واحد بايت) سيتم نسخ النص بالكامل بدءا من "1" و صولا لـ "5".

سؤالى هو ازاى اقدر اعدل على الداله دى و اخليها تنسخ من اليمين لليسار بمعنى النسخ بدءا من "5" و صولا إلى "1".

ممكن حد يسئل و يقول ايه الفائده فى كلتا الحالتين عملية النسخ بتم؟

الكلام ده صحيح لكن فى بعض الحالات الخاصه بيتحتم عليا النسخ من اليمين لليسار، منها الحاله اللى انا فيها دلوقتىو هى بإختصار:

عندى النص "ABCDEFGH" (سأسميه dest) و اريد استبدال الحرف A بالكلمه "XYZ" (سأسميه val) لإتمام هذه العمليه اقوم بزياده حجم المؤشر الذى يشير للنص dest عن طريق استدعاء الداله HeapReAlloc و بهذا سيتم زيادة مساحة dest (فى هذه الحاله 2 بايت) بعدها اقوم بنسخ الحروف بدءا من الحرف B وصولا للحرف H لمكانهم الجديد داخل النص dest (بأخره) المشكله انه اذا تم بدء النسخ من الحرف B سيتم النسخ فوق حرف اخر و هو فى حالتنا هذه الحرف D و بالتالى عند وصولى للحرف D سيكون تم تغييره لذا الحل هو بدء النسخ من الحرف H لعدم ابدال اى حرف من الموجودين.

المثال السابق هو توضيح لماذا النسخ العادى لا ينفع فى هذه الحاله، إذا لم يكن الشرح وافى فدعك منه، كل ما اصبوا إليه هو هل يمكن تعديل الكود السابق للنسخ من اليمين لليسار؟؟

ملحوظه: يمكننى عمل Loop للنسخ من اليمين لليسار و لكن ليس هذا ما اريده انا اريد استخدام تعليمات البروسسور (الخاصه بالنسخ) لهذا الغرض (إن وجدت).

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

تم تعديل هذه المشاركة بواسطة Muhammad alaa في 27 فبراير 2010 في 22:03

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

#2

↑ ↑ ↑ ↑ ↑ ↑ ↑

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

#3

السلام عليكم

هناك تعليمتين في النسخ

التعليمة cld تجعل عملية النسخ من اليسار الى اليمين

التعليمة std تجعل عملية النسخ من اليمين الى اليسار

اضنها ستشتغل معك

جرب هكدا :

MemoryCopyB PROC, Dest:PTR DWORD, Src:PTR DWORD, Len:DWORD

push esi         ; save esi
push edi         ; save edi
mov  ecx, Len    ; put length in ecx
mov  esi, Src  ; put source address in edi
mov  edi, Dest ; put destination address in edi
std
rep  movsb       ; repeat copy until ecx is zero
pop  edi         ; restore edi
pop  esi         ; restore esi
ret

MemoryCopyB ENDP
#4

السلام عليكم

جربت التعليمة std لكن دون جدوى ما تقوم به هو نفس الامر العادي اي النسخ من اليسار لليمين

فقط الفرق انك تعطيها عنوان نهاية string وتجعل DF = 1 في كل خطوة تقوم بانقاص المسجلين عوض زيادتهما

الحل الوحيد على ما اضن هو التأشير على اخر string وبداية النسخ العكسي داخل Loop وفي كل مرة انقاص مسجل وزايدة الاخر

1

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…