• 0
A.s Lover

ما الفرق بين طرق العنونة التالية؟

سؤال

ما الفرق بين

هذا :

MOV DL,BYTE PTR SS :[ECX]

وهذا :

MOV DL,BYTE PTR CS :[ECX]

وهذا :

MOV DL,BYTE PTR DS :[ECX]

تم تعديل بواسطه A.s Lover
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

7 إجابة على هذا السؤال .

  • 0

SS = Stack Segmant

CS = Code Segment

DS = Data Segment

عندما تكتب CS:[ECX] فهذا يعني "اعتبر قيمة CS كـ base index وأضف إليه الإزاحة المتمثلة بالقيمة ECX لتحصل على العنوان النهائي"

فمثلاً لديك CS = 1000h و ECX = 100h فيكون CS:[ECX] يشير إلى العنوان 1100h

انظر هنا:

http://cs.smith.edu/~thiebaut/ArtOfAssembly/CH04/CH04-2.html

الفقرة: 4.6.2.1 The Displacement Only Addressing Mode

* يرجى اختيار عنوان مناسب أكثر في المرة القادمة.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

SS = Stack Segmant

CS = Code Segment

DS = Data Segment

عندما تكتب CS:[ECX] فهذا يعني "اعتبر قيمة CS كـ base index وأضف إليه الإزاحة المتمثلة بالقيمة ECX لتحصل على العنوان النهائي"

فمثلاً لديك CS = 1000h و ECX = 100h فيكون CS:[ECX] يشير إلى العنوان 1100h

انظر هنا:

http://cs.smith.edu/~thiebaut/ArtOfAssembly/CH04/CH04-2.html

الفقرة: 4.6.2.1 The Displacement Only Addressing Mode

* يرجى اختيار عنوان مناسب أكثر في المرة القادمة.

أخي الكريم هل يمكن أن تشرح بتفصيل أكثر ؟

الذي فهمت من كلامك أن هناك فرقا بين هذه الطرق الثلاثة في العنونة

وبالتالي النتائج ستكون مختلفة في كل واحدة عن الأخرى

لكني وجدت خلاف ذلك عند التنقيح

post-243692-009458500 1344873975_thumb.j

post-243692-076680500 1344873256_thumb.j

post-243692-042601400 1344873332_thumb.j

= النتيجة واحدة!

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جرب هذا على Masm 16 وسترى:

post-7008-044498200 1344875757_thumb.png


.model small
.stack 100h
.data

.code

main proc far
mov ax, @data
mov ds, ax

mov dl, byte ptr ss:[bx]
mov dl, byte ptr ds:[bx]
mov dl, byte ptr cs:[bx]

mov ah, 4ch
int 21h

main endp
end main

لهذا لو عدت للفقرة التي أشرت إليها في AOA:

Intel named this the displacement-only addressing mode because a 16 bit constant (displacement) follows the mov opcode in memory. In that respect it is quite similar to the direct addressing mode on the x86 processors (see the previous chapter). There are some minor differences, however. First of all, a displacement is exactly that- some distance from some other point. On the x86, a direct address can be thought of as a displacement from address zero. On the 80x86 processors, this displacement is an offset from the beginning of a segment (the data segment in this example). Don't worry if this doesn't make a lot of sense right now. You'll get an opportunity to study segments to your heart's content a little later in this chapter. For now, you can think of the displacement-only addressing mode as a direct addressing mode. The examples in this chapter will typically access bytes in memory.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

هذه مشاركة كتبتها من قبل قد تفيد :

السلام عليكم .

نظام الـGDT موجود لتدعيم الـSegments في معالجات x86 , كما تعرفون في هذا النوع من المعالجات لدينا 6 مسجلات اقسام هم كالتالي :

cs : مسجل قسم الكود Code Segment .

ds : مسجل قسم البيانات Data Segment .

es : مسجل اضافي Extra Segment .

ss : مسجل قسم المكدس Stack Segment .

gs : مسجل لاغراض اخرى .

fs : مسجل لاغراض اخرى ( في أنظمة الـNT يستخدم ليشير الى بلوك الـKPRCB في الكرنل مود و الى TEB في اليوزر مود) .

المهم ... يجب ان يشير كل مسجل منهم الى مدخل للـ GDT أو يسمى بالـSegment Descriptor .

طيب كيف نتعامل مع الـGDT ؟؟ يعني كيف نقوم بوضع جدول للـGDT خاص بنا ؟

يمكن فعل ذلك عن طريق مسجل خاص يسمى GDTR لكن لا يمكننا التعامل معه مباشرة بل باستخدام أحد التعليمتين : SGDT/LGDT .

GDTR يتكون من 6 بايتات , أول WORD تحتوي على الـlimit او طول الـSegment Descriptors .

يليها DWORD يشير الى مصفوفة من الـSegment Descriptors , باختصار تركيب الـGDTR كالتالي :

struct _GDT {
WORD wLimit;
PKGDTENTRY Base;
}GDT, *PGDT;

كما تلاحظون فإن Base عبارة عن مؤشر الى مصفوفة من الـSegment Descriptor او ما اسميناه بـKGDTENTRY تركيبها كما توضح الصورة :

segmentdescriptorox7.png

وهذا هو التركيب ككود مع بعض التسهيلات لتفصيص الـFlags بشكل أفضل :

struct _KGDTENTRY {
USHORT LimitLow;
USHORT BaseLow;
union {
struct {
UCHAR BaseMid;
UCHAR Flags1;
UCHAR Flags2;
UCHAR BaseHi;
} Bytes;
struct {
ULONG BaseMid : 8;
ULONG Type : 5;
ULONG Dpl : 2;
ULONG Pres : 1;
ULONG LimitHi : 4;
ULONG Sys : 1;
ULONG Reserved_0 : 1;
ULONG Default_Big : 1;
ULONG Granularity : 1;
ULONG BaseHi : 8;
} Bits;
} HighWord;
} KGDTENTRY, *PKGDTENTRY;

التعليمة SGDT تأخذ عنوان لـGDT فتقوم بملأها بالحجم ومؤشر الـSegment Descriptor .

أما LGDT فتقوم بالعكس حيث تعطيها مؤشر لـGDT به الحجم ومؤشر لمصفوفة الـSegment Descriptor وتقوم هي بشحن مسجل الـGDTR بهم .

-----------------

نصيحة مني أن تقوموا بقراءة الـDocumentation الخاص بمعالجات انتل بتأني فستجدون بها ما تريدون واكثر .

Volume 3A: System Programming Guide

Volume 3B: System Programming Guide

تم تعديل بواسطه GamingMasteR
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

المهم ما يهمك هنا هو :

المهم ... يجب ان يشير كل مسجل منهم الى مدخل للـ GDT أو يسمى بالـSegment Descriptor .

مثلا .. DS يحمل القيمة 0x23 اذا هو يشير الى المدخل رقم 0x23 في جدول GDT.

بعد ذلك عن طريق الـDescriptor نستطيع ان نعرف عنوان وطول الذاكرة التي يشير اليها DS والـaccess المتاح ايضا.

لا تخلط هذا بنظام العنونة في انظمة 16-bit او virtual86/real

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

حقيقة شكر الله لكليكما

ولكني

لم أفهم

يبدو أن دماغي ثخين قليلا :mellow:

فلو كان ينبغي على كل عضو يريد أن ينتسب لهذا المنتدى اجتياز فحص الذكاء .... لما كنت أنا هنا :wacko:

ولكنها قدرة الله جاءت بي إليكم

فتحملاني قليلا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أنتم طلاب (ولا أظن ذلك :mellow: )

وأنا طويلب

فهلا جاد الطالب بما عنده من علم على الطويلب ؟

فعندها قد يصبح الطويلب طالبا بفضل ما تعلمه

ويصبح الطالب معلما بفضل ما علمه

كيف هالحل ؟

تم تعديل بواسطه طويلب العلم
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .