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

المقابل بلغة السي

بدأه hanintalal في 5 يوليو 2012 · 2 رد · 1,299 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

حاولت جاهدة معرفة المقابل بالسي للكود التالي

لكن مافي امل

هل ممكن احد يوضح لي

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

Listing 1: A

1 0x0000000100000ef0 <main+0>: push %rbp

2 0x0000000100000ef1 <main+1>: mov %rsp,%rbp

3 0x0000000100000ef4 <main+4>: sub $0x10,%rsp

4 0x0000000100000ef8 <main+8>: lea 0x51(%rip),%rax # 0x100000f50

5 0x0000000100000eff <main+15>: mov %rax,%rdi

6 0x0000000100000f02 <main+18>: callq 0x100000f24 <dyld_stub_puts> 7 0x0000000100000f07 <main+23>: movl $0x0,-0x8(%rbp)

8 0x0000000100000f0e <main+30>: mov -0x8(%rbp),%eax

9 0x0000000100000f11 <main+33>: mov %eax,-0x4(%rbp)

10 0x0000000100000f14 <main+36>: mov -0x4(%rbp),%eax 11 0x0000000100000f17 <main+39>: add $0x10,%rsp

12 0x0000000100000f1b <main+43>: pop %rbp

13 0x0000000100000f1c <main+44>: retq

#2
1 0x0000000100000ef0 <main+0>	: push %rbp
2 0x0000000100000ef1 <main+1>	: mov %rsp,%rbp
3 0x0000000100000ef4 <main+4>	: sub $0x10,%rsp
4 0x0000000100000ef8 <main+8>	: lea 0x51(%rip),%rax # 0x100000f50
5 0x0000000100000eff <main+15>	: mov %rax,%rdi
6 0x0000000100000f02 <main+18>	: callq 0x100000f24 <dyld_stub_puts>
7 0x0000000100000f07 <main+23>	: movl $0x0,-0x8(%rbp)
8 0x0000000100000f0e <main+30>	: mov -0x8(%rbp),%eax
9 0x0000000100000f11 <main+33>	: mov %eax,-0x4(%rbp)
10 0x0000000100000f14 <main+36>	: mov -0x4(%rbp),%eax
11 0x0000000100000f17 <main+39>	: add $0x10,%rsp
12 0x0000000100000f1b <main+43>	: pop %rbp
13 0x0000000100000f1c <main+44>	: retq

أعتقد أنه هذا الكود لماك بمعالج 64 بت. لم يسبق أبداً أن تعاملت معه , أو حتى رؤيته على الطبيعة P:, لكن أعتقد أنه لم يستدعي سوى دالة واحد وتأخذ محدد واحد. أظن أنها puts أو printf كتبت بالطريقة:

printf("foo\n");

سأخمن وأقول أن الكود الأصلي مثل :

#include<stdio.h>

int main() {
    printf("foo\n");
    return(0);
}

أو :

#include<stdio.h>

int main() {
    puts("foo");
    return(0);
}

يمكنك التحقق بتحميل البرنامج بعد تصريفه لـgdb هكذا :

$ gdb foo

وكتابة :

(gdb) disassemble main

وإنظري لمدى التطابق بين الأكواد.

2
#3
Mr.B كتب:

1 0x0000000100000ef0 <main+0>	: push %rbp
2 0x0000000100000ef1 <main+1>	: mov %rsp,%rbp
3 0x0000000100000ef4 <main+4>	: sub $0x10,%rsp
4 0x0000000100000ef8 <main+8>	: lea 0x51(%rip),%rax # 0x100000f50
5 0x0000000100000eff <main+15>	: mov %rax,%rdi
6 0x0000000100000f02 <main+18>	: callq 0x100000f24 <dyld_stub_puts>
7 0x0000000100000f07 <main+23>	: movl $0x0,-0x8(%rbp)
8 0x0000000100000f0e <main+30>	: mov -0x8(%rbp),%eax
9 0x0000000100000f11 <main+33>	: mov %eax,-0x4(%rbp)
10 0x0000000100000f14 <main+36>	: mov -0x4(%rbp),%eax
11 0x0000000100000f17 <main+39>	: add $0x10,%rsp
12 0x0000000100000f1b <main+43>	: pop %rbp
13 0x0000000100000f1c <main+44>	: retq

أعتقد أنه هذا الكود لماك بمعالج 64 بت. لم يسبق أبداً أن تعاملت معه , أو حتى رؤيته على الطبيعة P:, لكن أعتقد أنه لم يستدعي سوى دالة واحد وتأخذ محدد واحد. أظن أنها puts أو printf كتبت بالطريقة:

printf("foo\n");

سأخمن وأقول أن الكود الأصلي مثل :

#include<stdio.h>

int main() {
    printf("foo\n");
    return(0);
}

أو :

#include<stdio.h>

int main() {
    puts("foo");
    return(0);
}

يمكنك التحقق بتحميل البرنامج بعد تصريفه لـgdb هكذا :

$ gdb foo

وكتابة :

(gdb) disassemble main

وإنظري لمدى التطابق بين الأكواد.

جربته وظهر بشكل ممتاز ماعدا عنوان التعليمة lea طبعا

ولكن اخي هل ممكن ان توضح لي الغرض من هذه السطور

7 0x0000000100000f07 <main+23> : movl $0x0,-0x8(%rbp)

8 0x0000000100000f0e <main+30> : mov -0x8(%rbp),%eax

9 0x0000000100000f11 <main+33> : mov %eax,-0x4(%rbp)

10 0x0000000100000f14 <main+36> : mov -0x4(%rbp),%eax

هل هو لتخزين المعطيات ام لتمرير قيمة المدخلات ؟؟

وجزاك الله الخير

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