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

برمجة المعالج Z-80 بلغة الأسمبلي

مغلق
بدأه أحمد جقلان في 21 مايو 2003 · 0 رد · 2,619 مشاهدة · في الأخبار والنقاشات التقنية
مشاركة: واتساب X فيسبوك تيليجرام
#1

الجلسة (1)

النظام الحاسوبي

يتألف نظام الحاسب من 3 عناصر أساسية هي:CPU , Memory , I/O Devices.

الذاكرة:

إن أصغر وحدة ذاكرية تكون مؤلفة من قلاب من النوع D-FF, لأنه يتميز بأنه يحتفظ بالقيمة المطبقة على الدخل D عند الخرج Q, ومن أجل التحكم بعملية القراءة أو الكتابة من/إلى الذاكرة نستخدم ما يسمى بالعازل Buffer وهو على نوعين: بقطب تحكم, وبدون قطب تحكم.

ميزات استخدام العازل:

1. العزل بين وحدة التخزين والوحدات الأخرى.

2. يمكن اعتباره كمنبع للتيار.

3. إذا كان مطبقاً على قطب التحكم القيمة (0) فالعازل يقابل قاطع مفتوح

و= = = = (1) = = سلك

عمليات الذاكرة الأساسية:

أولاً: عملية الكتابة(Write Cycle):

1. وضع المعطيات على خط المعطيات.

2. تفعيل خط التحكم بالكتابة(Write = 1).

3. تفعيل التحكم بالوحدة الذاكرية(Enable = 1).

سبب الفارق بين إشارة المعطيات و إشارات التحكم هو أن إشارة التحكم تأتي بعد أن تستقر قيمة إشارة المعطيات عند قيمتها النهائية.

ثانياً:عملية القراءة (Read Cycle):

1. Read = 1.

2. E = 1.

توسع مفهوم الذاكرة:

لقد شرحنا بنية العنصر الأساسي في الذاكرة والذي يستخدم لتخزين بت واحدة 1bit, أما لتخزين مجموعة من البتات فنحتاج إلى مجموعة من هذه العناصر كما في الشكل التالي:

إن التمثيل السابق يحتاج إلى تخصيص دخل مفرد لكل حجرة, وهذا أمر غير مجدي لأننا من أجل ذاكرة بـ 1KB سنحتاج إلى 1024 مدخل عنوان, لحل هذه المشكلة نستخدم فاك شيفرة يقوم بتحديد الحجرة الذاكرية التي سيتم تفعيلها وهكذا سيكون عدد المداخل من رتبة log2(n)حيث n تمثل حجم الذاكرة بالبايت, والشكل التالي يوضح ذلك:

التعامل مع الذاكرة يتم وفق النظام الست عشري لسببين:

1. سهولة التحويل إلى الثنائي.

2. استخدام خانات عددها أقل لتمثيل أعداد أكبر.

الجلسة(2)

برمجة الذواكر EPROM

تتم عملية برمجة الذواكر من النوع EPROM على مرحلتين:

1. مرحلة التفريغ:

ويتم في هذه المرحلة جعل خانات الذاكرة تأخذ القيمة 1 أي أنه سيتم تخزين القيمة الست عشرية FF في جميع بايتات الذاكرة,

2. مرحلة التخزين:

تجري عملية مقارنة بين القيمة المراد تسجيلها والقيمة الموجودة أصلاً في الذاكرة , حيث يتم قلب قيمة الخانات التي تحوي القيمة 1 إذا كانت القيمة المراد تسجيلها هي 0 ولا يمكن أن يحدث العكس.

مثال:

1 1 1 1 1 1 1 1

1 1 1 0 1 0 0 1

نستخدم برنامج Power من أجل عملية البرمجة بعد أن نصل جهاز البرمجة إلى الحاسب عن طريق منفذ الطابعة ونأخذ كمثال عن الذواكر EPROM الذاكرة 27c256 .

مكونات البرنامج:

يحتوي البرنامج على القوائم التالي:

1. Device: لتحديد نوع الذاكرة التي نريد برمجتها واسم الشركة الصانعة لها, ورقم هذه الدارة.

2. Edit: تحتوي على الأمر Buffer الذي يقوم بعرض محرر نصوص نكتب فيه القيم التي نريد نقلها إلى الذاكرة.

3. RunFunction:

- Program : نقل معلومات ال Buffer إلى الذاكرة.

- Read : قراءة محتويات الذاكرة.

- Verify : يجري مقارنة بين الذاكرة وال Buffer فإذا عثر على أي اختلاف يشير إليه ويتوقف.

- Compare : = = = = = ثم يعرض ملخصاً عن الاختلافات.

- BlankCheck : يفحص هل الذاكرة فارغة أم لا, وهذه العملية ضرورية لأنه حتى تتم عملية التخزين بأمان يجب أن نكون متأكدين من أن الذاكرة فارغة بالكامل أي أن خاناتها تأخذ القيمة 1.

4. File :

- Load File : نقل محتويات ملف موجود في الكمبيوتر إلى ال Buffer.

- Quite : للخروج من البرنامج.

إمكانيات البرنامج:

يمكن أن نضع IC لا نعرف أية معلومات عنها فيقوم البرنامج بفحصها وسرد المعلومات الهامة عنها.

- انتهت المحاضرة -

الجلسة (3)

وحدة المعالجة المركزية

تتألف وحدة المعالجة المركزية من ثلاثة أجزاء رئيسية:

1. ALU (Arithmetic Logic Unit):

تقوم بإجراء العمليات الحسابية والمنطقية

ويتم تمييز معالج عن آخر من بقوة

العمليات التي ينفذها.

2. CU (Control Unit):

تعطي الإشارات اللازمة لتنظيم عمل المعالج

مثل تفعيل الذاكرة وإشارات المقاطعات

للأجهزة الأخرى.

3. Registers :

تختلف المعالجات بطول المسجلات 4 و 8 و 16 ..

يتميز المعالج ب:

1. السعة : أ- عرض المسجلات

ب- عرض ممر المعطيات.

2. التردد (السرعة)

3. قوة التعليمات: إزاحة , دوران , جمع , ..

المسجلات

بنية المسجل:هو حجرة ذاكرية واحدة مؤلفة من عدد من الخانات موجود ضمن المعالج ويتم تمييز كل مسجل من خلال اسمه وليس من خلال عنوانه كما هو الحال بالنسبة للذاكرة.

لمحة تاريخية عن تطور المعالجات

عرض ممر المعطيات(bit) عرض المسجلات(bit) الموديل الشركة المنتجة

4 4 4040 Intel

8 8 8080 =

8 8 Z-80 Zilog

8 16 8088 Intel

16 16 8086 =

المعالج Z-80

يعنون ذاكرة 64 KB, تردده 3.5à4.5 MHz.

ملاحظة: في التطبيقات الصناعية يمكن قبول معالجات بسرعات تصل حتى 300 MHz لتجنب حدوث أخطاء ناجمة عن السرعة.

تقسم المسجلات إلى أقسام رئيسية هي:

1. المسجلات العامة وعددها 7 :

ليس لها وظيفة محددة ويمكن أن تشترك في أي عملية أسمائها(A, B, C, D, E, H, L) وكل منها بطول 8 bit .

المراكم Accumulator:

مسجل موجود في كل المعالجات , هام لأنه قريب من وحدة الحساب والمنطق وهو المسجل العام A.

يتم تخزين ناتج العمليات الحسابية ضمنه .

عندما يكون هناك أعداد ب 16 bit يتم تجميع المسجلات على الشكل التالي: AF , HL , DE , BC أما عند وجود أعداد ب 32 bit فيتم تجزئة العملية على مرحلتين.

2. المسجلات النظيرة وعددها 7 ( 8 bit ):

هي (A', B', C', D', E', H', L') لا يمكن إجراء عمليات مباشرة عليها وإنما يمكن إجراء عملية تبديل لمحتواها مع محتوى المسجلات العامة.

3. مسجلات الفهرسة وعددها 2 وهي (Ix, Ty) كل منها بطول(16 bit) :

تخزن عنوان قيمة معينة في الذاكرة وتتميز بأنها تتعامل مع الإزاحة بمقدار بايت واحد.

مثال: Ix + 07

4. مسجلات التأشير عددها 2 كل منها بطول (16 bit) وهي:

- PC : Program Counter

يشير إلى التعليمة الأولى عند بدء تنفيذ البرنامج ثم يشير إلى التعليمة التالية أثناء التنفيذ بشكل آلي.

- SP : Stack Pointer

يشير إلى عنوان القمة للمكدّس.

مثال: آلية عمل مسجلات التأشير:

Stack

عند تنفيذ محتوى العنوان 100 يجب أن يكون PC=111 لكن انتقل PC إلى 400, من أجل عدم ضياع قيمة PC السابقة يتم تخزين قيمة PC في ال Stack , وعند العودة يتم إعادة محتوى البايتين السابقين إلى ال PC. وبالمثل إذا تم القفز من الحجرة 405 يتم تخزين القيمة 406 في قمة المكدس ويتم تحديث المكدس بتناقص قيمة ال SP الذي يشير إلى قمة المكدس. في نهاية البرنامج الثاني يتم العودة إلى التعليمة التالية من البرنامج الفرعي الأول.

ملاحظة: كل تعليمة قفز توجد تعليمة عودة مقابلة لها وفي حال وجود خلل يفقد البرنامج السيطرة.

ملاحظة: المكدس ينبغي أن يكون بعيداً عن حجرات الذاكرة التي يجري التعامل معها.

5. مسجل الأعلام:

مسجل واحد بطول 8 bit يحتوي عدة أعلام وكل علم مختص بشيء معين يأخذ قيمة 0 أو 1 للدلالة إلى حدوث عملية ما, ومسجل الأعلام هو المسجل F, والأعلام هي:

1- (Zero Flag) ZF: يأخذ قيمة 1 عندما يكون ناتج عملية ما هو الصفر, يفيد في تساوي العددين إذا كانت العملية هي الطرح.

2- (Carry Flag) CF: يأخذ القيمة 1 عندما يحدث حمل ناتج عن عملية معينة, ويحل محل الخانة الأكثر أهمية.

3- (Half-Carry Flag) HF: يشير إلى حدوث حمل من الخانة الرابعة إلى الخانة الخامسة.

يستخدم في حال استخدام شيفرات بمجال 4bit مثل BCD .

4- (Overflow Flag) VF: يشير إلى حدوث طفحان في العمليات على أعداد ذات خانة إشارة عند حدوث حمل من الخانة قبل الأخيرة إلى الخانة الأخيرة, أي أنه لم يتم استيعاب الناتج ضمن 7 خانات.

5- (Sign Flag) SF: يشير إلى إشارة الناتج (0 موجبة, 1 سالبة), أي مطابق لخانة الإشارة.

6- (Negative Flag) NF:يشير إذا كانت العملية سالبة أو موجبة(0 موجبة, 1 سالبة)

7- (Parity Flag) PF: يشير إلى عدد الواحدات ضمن العدد:

إذا كان عدد الواحدات فردي يأخذ القيمة 0

وإذا كان عدد الواحدات زوجي يأخذ القيمة 1.

الجلسة (4)

Assembly Language(1)

1- LD d , s

تقوم بتحمبل محتوى s إلى d كما في المثال التالي:

B = 30h B = 30h

A = 10h A = 30h

طرق العنونة:

1. الكتابة إلى المسجلات:

2. العنونة الفورية: LD A , 20h

3. العنونة المسجلية: LD B , E

4. العنونة المباشرة: LD A , (0300h)

5. العنونة غير المباشرة: LD A , (HL)

الكتابة إلى الذاكرة:

LD (HL) , A

ملاحظة: يجب الانتباه إلى أن الطرفين يجب أن يكون لهما نفس الحجم.

فائدة العنونة غير المباشرة:

عدم ذكر العنوان بشكل صريح وإنما تحميله إلى مسجل يعطي مرونة في التعامل مع الذاكرة ويقلل من عدد التعليمات المكتوبة.

مثال توضيحي:

إذا كان لدينا بلوك من الذاكرة بطول 50 بايت ونريد إجراء عملية تتكرر على جميع هذه البايتات مثل ضرب محتوياتها برقم ما, نستخدم حلقة تمر على جميع الحجرات نذكر الأمر ضمنها لمرة واحدة, حيث نقوم بتحميل عنوان بداية البلوك إلى مسجل بطول 16 bit وفي كل مرة نقوم بزيادة محتوى هذا المسجل بعدد المرات التي نريدها.

جداول ترميز العمليات OpeCode

الفائدة من استخدام هذه الجداول التأكد من وجود تعليمة معينة أو عدم وجودها.

أمثلة:

LD BC , (0615h) à ED4B 15 06

LD BC , DE غير متوفرة

لإيجاد الحل لتنفيذ مثل هذه التعليمة توجد عدة طرق منها:

1. LD C , E

LD B , D

2. Stack

Push BC وضع محتويات المسجل في موقع الذاكرة الذي يشير إليه مؤشر المكدس

POP HL تحميل محتوى العنوان الذي يشير إليه مؤشر المكدّس إلى المسجل

في بداية أي برنامج يجب أن نحدّد مكان المكدّس مثلاً:

LD SP , 0900h

فائدة استخدام المكدّس: عند وجود برنامج فرعي يستخدم المسجلات ونحتاج إلى قيمها بعد انتهاء تنفيذ البرنامج الفرعي نقوم بإلحاق هذه القيم إلى المكدّس ثم نستعيدها كمايلي:

Push DE

Push BC

……..

…….

POP BC

POP DE

Return Statement

عمليات أخرى بلغة الأسمبلي:

ADD A , S A + S à A الجمع بدون حمل

ADC A , S A + S + CF à A الجمع مع وجود حمل

SUB A , S A – S à A الطرح بدون استعارة

SBC A , S A – S – CF à A الطرح مع وجود استعارة

AND A , S

OR A , S

XOR A , S

CP A , S تطرح بشكل وهمي وتؤثر على الأعلام فقط

INC S زيادة محتوى المسجل بمقدار 1

DEC S إنقاص محتوى المسجل بمقدار 1

برنامج بلغة الأسمبلي:

المطلوب كتابة برنامج بلغة الأسمبلي لحساب ناتج جمع عددين بطول 16bit الأول مخزّن بدءاً من العنوان 100 والثاني مخزّن بدءاً من العنوان 102 ووضع الناتج بدءاً من العنوان 104, وكتابة الـ OpeCode لهذا البرنامج.

Assembly OpeCode

LD A , (0100h)ADD A , (0102h)LD (0104h) , ALD A , (0101h)ADC A , (0103h)LD (0105h) , A 0A 00 018E20013204010A0101BE0301320501

الجلسة(5)

Assembly Language(2)

Ex AF , AF' لتبديل محتويات المسجلات مع المسجلات النظيرة

Exx لتبديل محتويات المسجلات

Ex (SP) , HL

يبدل L مع محتوى SP, و H مع محتوى SP-1

ملاحظة: لا يتم تغيير الحجرة التي يشير إليها المكدّس.

Block Transfer Group

يتم تمييز البلوك بمعرفة عنوان البداية وطول البلوك, أو عنوان النهاية وطول البلوك(عدد الحجرات)

للقيام بعملية النسخ يجب أن يكون عنوان البداية مخزناً في HL وعدد الحجرات في BC كما يجب أن يكون عنوان المستقر مخزناً في DE.

LD HL , 0500h حجز بلوك بدايته 500

LD BC , 0020h وعد حجراته 20

1. LDI (Increment)

(HL) à (DE)

HL = HL + 1

DE = DE + 1

BC = BC - `

2. LDIR Repeat Until BC = 0

3. LDD

(HL) à (DE)

HL = HL – 1

DE = DE – 1

BC = BC – 1

4. LDDR Repeat Until BC = 0

Block Search Group

مقارنة قيمة موجودة في المراكم مع بلوك إذا كانت القيمتان متساويتان يتوقف التنفيذ ويأخذ ZF القيمة 1:

1. CPI (Increment)

A – (HL)

HL = HL + 1

BC = BC – 1

2. CPIR

3. CPD

A – (HL)

HL = HL – 1

BC = BC – 1

4. CPDR

Jump Call And Return Group

1. JP Label قفز غير مشروط

2. JP C , Next قفز مشروط(إذا وجد حمل, اقفز)

مثال عن القفز:

Assemply OpeCode MachineCode

Next:LD A , 20h LD B , 10h Add A , B JP C , Next 3E 20D6 1080DA 00 01 0100h0102h0104h0105

وهناك تعليمة CALL لتنفيذ برنامج فرعي, تختلف عن تعليمة القفز في أنها يجب أن يتم تنفيذ مايليها, ولكن بعد كل تعليمة قفز يجب أن تكون هنالك تعليمة عودة:

1. CALL

2. CALL C , Next

3. DJNZ

Bنستخدمها عندما نريد تنفيذ عملية القفز عدد من المرات, وهذا العدد ينبغي أن يخزّن في المسجل

4. RET

الجلسة (6)

Assembly Language(3)

أمثلة عن برمجة المعالج Z-80 بلغة الأسمبلي

1- يراد وضع القيمة CC في بلوك يبدأ بالعنوان 50 وبطول 10h:

LD HL , 050

LD B , 10

LD (HL) , 0CC

INC HL

DJNZ 0FB

2- أكتب تعليمات الأسمبلي للمعالج Z-80 التي تقوم بجمع عددين بطول 6Byte, العدد الأول موجود في الذاكرة بدءاً من العنوان 50, والعدد الثاني موجود في الذاكرة بدءاً من العنوان 56, مع وضع الناتج بدءاً من العنوان 60.

LD HL , 0050

LD DE , 0056

LD IX , 0060

LD B , 06

AND A ,A

LD A , (DE)

ADC A , (HL)

LD (IX + 00) , A

INC HL

INC DE

INC IX

DJNZ 0F5

JRNZ 04

LD A , 01

JR 02

LD A , 00

LD (0066) , A

3- أكتب برنامج يعطي عدد مرات تكرار القيمة FF في بلوك من الذاكرة يبدأ من العنوان 50 وبطول 10h Byte.

LD HL , 0050

LD B , 10

LD C , 00

LD A , 0FF

CP A , (HL)

JRNZ 1

INC C

INC HL

DJNZ 0F7

LD A , C

LD (0060) , A

تمرين:

أكتب برنامج بلغة الأسمبلي لإيجاد عدد الأعداد الزوجية في بلوك من الذاكرة يبدأ بالعنوان 50 وطوله 10h ويوضع الناتج في العنوان 60H.

LD HL , 0050

LD B ,10

LD C , 00

LD A , 01

AND A , (HL)

JRNZ 01

INC C

INC HL

DJNZ 0F7

LD A , C

LD (0060) , A

الجلسة (7)

Assembly Language(4)

المثال الأول:

يراد إيجاد أكبر عدد في بلوك من الذاكرة يبدأ من العنوان 50 وبطول 10h , يتم وضع هذا العدد في العنوان 60.

Flow Chart

تمرين:

تعديل البرنامج السابق

بحيث يتم وضع عنوان أكبر عدد في الحجرتين 61 و 62.

المثال الثاني:

المطلوب ترتيب أعداد موجودة في الذاكرة بدءا من

العنوان 50h وبطول 10h باستخدام خوارزمية الفرز الفقاعي:

تمرين:

يطلب عزل الأعداد الموجبة عن الأعداد السالبة في بلوك من الذاكرة يبدأ من العنوان 50h وبطول 20h حيث : توضع الأعداد الموجبة ابتداء من العنوان 70h والأعداد السالبة ابتداء من العنوان 90h.

و يوضع عدد الأعداد الموجبة في الحجرة 0B0h, ويوضع عدد الأعداد السالبة في الحجرة 0B1h.

LD HL , 00F4

LD B , 10

LD DE , 0000

LD IX , 0070

LD IY , 0090

INC HL

LD A , (HL)

AND A , 80

JRNZ 09

LD A , (HL)

LD (IX+00) , A

INC IX

INC D

DJNZ 0F1

LD A , (HL)

LD (IY+00) , A

INC IY

INC E

DJNZ 0E8

LD A , D

LD (00B0) , A

LD A , E

LD (00B1) , A

Ahmad Jakalan

اللهم إني أسألك علماً نافعاً وقلباً خاشعاً وعملاً متقبّلاً صالحاً

هذا الموضوع مغلق.

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

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

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

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

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