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

تحويل شيفرة من لغة الاسمبلي الى لغة السي

بدأه Adam Sharafeddine في 3 سبتمبر 2013 · 6 رد · 1,667 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

 

عندنا هذا الكود بالاسمبلي:

x at %ebp+8, y at %ebp+12
 movl 8(%ebp), %eax
 movl 12(%ebp), %edx
 cmpl $-3, %eax
 jge .L2
 cmpl %edx, %eax
 jle .L3
 imull %edx, %eax
 jmp .L4
 .L3:
 leal (%edx,%eax), %eax
 jmp .L4
 .L2:
 cmpl $2, %eax
 jg .L5
 xorl %edx, %eax
 jmp .L4
 .L5:
 subl %edx, %eax
 .L4:

و هذا الكود الى فوق تمّ الحصول عليه بعد ترجمة متن دالة (الى لغة الاسمبلي) تحمل الprototype التالي:

int test ( int x, int y);

لازم حوّل الكود خلفا الى لغة السى..

 

طلع معي هذا الكود (و حسب الحل الموجود بالكتاب هو كود خاطىء)

int test( int x, int y)
{
	if ( x >= -3) {
		if ( x > 2 ) {
			return ( x - y );
		}
		else {
			return ( x ^ y );
		}
	}
	else if ( x <= y) {
		return ( 1 + x + y );
	}
	else {
		return ( x * y );
	}
	
}

ربّما سؤالي شوي بياخد وقت بس انا صرلي يومين بفّكر و بضيّع وقت فيه.

 

هذا الكود "الصحيح" موجود في خانة الحلول في الكتاب:

int test(int x, int ) {
 int val = x^y;
 if (x < -3) {
 if (y < x)
 val = x*y;
 else
 val = x+y;
} else if (x > 2)
 val = x-y;
 return val;
 }

لا افهم من اين جاء هذا الكود.

تم تعديل هذه المشاركة بواسطة adam-master في 3 سبتمبر 2013 في 09:28

#2

من غير ما اجرب الكود هل نتيجة الكودين واحدة؟

 

أن كانت نتيجة الكودين واحدة فأن كلا الحلين صحيحين لانه من الصعب جدا ان تكون طريقة حل مؤلف الكتاب كحل مصمم البرنامج لا بد من اختلاف طريقة الحل

2

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#3

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


:D


#4

الـcompiler يعدل في البرنامج ويختلف التعديل من مصرف لآخر، حتى في نفس المصرف لو تغير اعدادات تحسين البرنامج خرج لك برنامج آخر، لكنه نفس البرنامج فقط التعليمات تختلف.

 

يمكنك التأكد من مطابقة الدالتين عن طريق اختبار عشوائي:

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>

int test1( int x, int y)
{
  if ( x >= -3) {
    if ( x > 2 ) {
            return ( x - y );
        }
        else {
            return ( x ^ y );
        }
    }
    else if ( x <= y) {
        return ( 1 + x + y );
    }
    else {
        return ( x * y );
    }
}

int test2(int x, int y) {
  int val = x^y;
  if (x < -3) {
  if (y < x)
    val = x*y;
  else
    val = x+y;
  } else if (x > 2)
    val = x-y;
  return val;
}

int main(int argc, char **argv) {
  srand(time(NULL));
  int i, x, y;
 
  for( i = 0 ; i < 100 ; i++ ) {
    x = rand();
    y = rand();
    assert( test1(x, y) == test2(x, y) );
  }

  return 0;
}

 

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

1
#5

صحيح Mr.B

لم انتبه الى تجريب الكود .. يمكن عشان الكود تبع المؤلف مختلف كتير..!

#6

طلع في غلط بسيط في الكود.. هذا هو الكود المعدّل:

int test( int x, int y)
{
	if ( x >= -3) {
		if ( x > 2 ) {
			return ( x - y );
		}
		else {
			return ( x ^ y );
		}
	}
	else if ( x <= y) {
		return ( x + y ); // Here! x + y NOT ( 1 + x + y ).. leal etc etc
	}
	else {
		return ( x * y );
	}
	
}
#7

من المستحيل ان يعطيك نفس الكود

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