اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

سأوضح لك كل الخطوات اللازمة لكتابة نفس الكود في لغة Assembly ثم سأدعك تحاولين بنفسك.

  • أولاً: لدينا الكود التالي بلغة C#:
int i, sum = 0;

سنبدأ بتعريف متغير إسمه sum لنحفظ فيه القيمة النهائية، لاحظي الكود التالي بلغة Assembly:

.data 				; هنا نقوم بتعريف القسم الذي سنعرف المتغيرات فيه
sum	  DD 	0 		; نعرف متغير بإسم
					;sum
					;بحيث يأخذ الحجم
					;DD
					; وهو إختصار لـ
					; Define Doubleword
					; أي سيكون حجمه 4 بايت

لم أقم بتعريف المتغير i لأننا لن نحتاجه بل سنقوم بعملية التكرار تبعاً للقيمة الموجودة في الـregisters كما سأوضح لاحقاً.

  • ثانياً: سنرى كيف يمكننا عمل Loop في لغة Assembly بحيث يتم تنفيذه 100 مرة كما في الكود المرفق من قبلك:
mov ECX,100		; نضع القيمة التي نريد أن نبدأ بها في المسجل ECX
				; حيث سيتم طرح واحد من القيمة في كل تكرار وسيتوقف عند الوصول إلى الرقم صفر
myloop:			; تعريف القسم الذي نريد تكرار تنفيذه بحيث يمكننا الإشارة إليه لاحقاً
...				;بعد تعريف القسم نكتب التعليمات التي نريد تكرارها هنا
loop myloop		;في هذه التعليمة تعني قم بتكرار الـ
				;label
				; أو القسم الذي قمنا بتعريفه وهو بإسم
				; myloop

ملاحظة: الأمر mov يقوم بنقل القيمة الواقعة بعد الفاصل إلى المتغير أو المسجل الذي قبلها، لتوضيح الأمر إليك شرح لتعليمة بسيطة تستخدم الأمر mov :

mov ax,5  ;نقوم بإسناد الرقم 5 في المسجل
		  ;ax

 

  • 0
نشر

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

```c
// تعليق: روبوت تتبع الإنسان باستخدام Arduino
// تعليق: تم إنشاء الكود بواسطة DIY Builder
// تعليق: يجب تثبيت مكتبات AFMotor و NewPing قبل تحميل الشيفرة
// تعليق: يمكن العثور على جميع المكتبات الضرورية من مدير مكتبات Arduino.
// تعليق: تواصل معي على Instagram لأي استفسار (Insta Id: diy.builder)
// تعليق: تم التعديل في 7 مارس 2022
// تعليق: الإصدار 1.1

// تضمين شيفرة المكتبة:
#include <NewPing.h>
#include <Servo.h>
#include <AFMotor.h>

// تعريف توصيلات الأقراص والمحركات:
#define RIGHT A2              // مستشعر الأشعة تحت الحمراء الأيمن متصل بالمدخل التناظري A2 في Arduino Uno:
#define LEFT A3               // مستشعر الأشعة تحت الحمراء الأيسر متصل بالمدخل التناظري A3 في Arduino Uno:
#define TRIGGER_PIN A1        // دبوس الإرسال متصل بالمدخل التناظري A1 في Arduino Uno:
#define ECHO_PIN A0           // دبوس الاستقبال متصل بالمدخل التناظري A0 في Arduino Uno:
#define MAX_DISTANCE 200      // المسافة القصوى لقياس المسافة:

// متغيرات لتخزين قراءات المستشعرات:
unsigned int distance = 0;    // متغير لتخزين مسافة مستشعر الموجات فوق الصوت:
unsigned int Right_Value = 0; // متغير لتخزين قراءة مستشعر الأشعة تحت الحمراء الأيمن:
unsigned int Left_Value = 0;  // متغير لتخزين قراءة مستشعر الأشعة تحت الحمراء الأيسر:

// إعداد NewPing مع تعريف الدبابات والمحركات:
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

// إنشاء كائنات المحركات:
AF_DCMotor Motor1(1, MOTOR12_1KHZ);
AF_DCMotor Motor2(2, MOTOR12_1KHZ);
AF_DCMotor Motor3(3, MOTOR34_1KHZ);
AF_DCMotor Motor4(4, MOTOR34_1KHZ);

// إنشاء كائن سيرفو للتحكم في المحرك:
Servo myservo;
int pos = 0;  // متغير لتخزين وضعية المحرك:

void setup() {
  // تهيئة التواصل التسلسلي:
  Serial.begin(9600);

  // توصيل المحرك السيرفو بالدبوس 10 في Arduino UNO:
  myservo.attach(10);

  // دورة لتحريك المحرك السيرفو إلى وضعية ابتدائية:
  for (pos = 90; pos <= 180; pos += 1) {
    myservo.write(pos);
    delay(15);
  }
  for (pos = 180; pos >= 0; pos -= 1) {
    myservo.write(pos);
    delay(15);
  }
  for (pos = 0; pos <= 90; pos += 1) {
    myservo.write(pos);
    delay(15);
  }

  // تعيين وضع الدبابات كإدخال:
  pinMode(RIGHT, INPUT);
  pinMode(LEFT, INPUT);
}

void loop() {
  // انتظار 50 مللي ثانية بين القياسات:
  delay(50);

  // قياس المسافة باستخدام مستشعر الموجات فوق الصوت:
  distance = sonar.ping_cm();

  // طباعة المسافة في منفذ التسلسل:
  Serial.print("distance");
  Serial.println(distance);

  // قراءة قيم أقراص الأشعة تحت الحمراء وطباعتها:
  Right_Value = digitalRead(RIGHT);
  Left_Value = digitalRead(LEFT);

  Serial.print("RIGHT");
  Serial.println(Right_Value);

  Serial.print("LEFT");
  Serial.println(Left_Value);

  // فحص ما إذا كانت قيمة مستشعر الموجات فوق الصوت في النطاق من 1 إلى 15:
  if ((distance > 1) && (distance < 15)) {
    // التحرك إلى الأمام:
    Motor1.setSpeed(130);
    Motor1.run(FORWARD);
    Motor2.setSpeed(130);
    Motor2.run(FORWARD);
    Motor3.setSpeed(130);
    Motor3.run(FORWARD);
    Motor4.setSpeed(130);
    Motor4.run(FORWARD);
  } else if ((Right_Value == 0) && (Left_Value == 1)) {
    // الدوران لليسار:
    Motor1.setSpeed(150);
    Motor1.run(FORWARD);
    Motor2.setSpeed(150);
    Motor2.run(FORWARD);
    Motor3.setSpeed(150);
    Motor3.run(BACKWARD);
    Motor4.setSpeed(150);
    Motor4.run

حول الكود اسمبلي

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...