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

تحويل كود #C إلى أسمبلي

Meme 55555

السؤال

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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...