البرمجة

كيفية تمرير المعاملات في لغة التجميع x86

In x86 assembly language, parameters are typically passed on the stack. However, in your example code, the parameter is not being passed correctly. Let’s correct the code to pass the parameter 0x08 to my_function using the stack:

assembly
section .text global _start ; Function to demonstrate passing parameters my_function: ; Retrieve the parameter from the stack pop eax ; Your function code here, using the parameter in eax ; For example, you can print the parameter value ; using the sys_write syscall mov ebx, eax ; Move the parameter to ebx for syscall mov eax, 4 ; sys_write syscall number mov ecx, esp ; The address of the string to write (if applicable) mov edx, 1 ; Length of the string (if applicable) int 0x80 ; Call kernel ret ; Return from function _start: ; Push the parameter onto the stack push dword 0x08 ; Call the function call my_function ; Exit the program mov eax, 1 ; sys_exit syscall number xor ebx, ebx ; Exit code 0 int 0x80 ; Call kernel

In this corrected code, the push dword 0x08 instruction pushes the parameter onto the stack before calling my_function. Inside my_function, the pop eax instruction retrieves the parameter from the stack into the eax register for use in the function.

المزيد من المعلومات

في لغة التجميع x86، يمكن تمرير المعاملات إما عبر السجلات أو عبر الذاكرة المؤقتة (الستاك). في المثال الذي قدمته، كنت تحاول تمرير المعلمة عبر الستاك، ولكن كودك لم يكن صحيحًا. لتصحيح الكود وتمرير المعلمة بنجاح عبر الستاك، يجب عليك القيام بالخطوات التالية:

  1. استخدام تعليمة push لوضع قيمة المعلمة على الستاك قبل استدعاء الدالة.
  2. داخل الدالة، يمكنك استخدام تعليمة pop لاستخراج قيمة المعلمة من الستاك وتخزينها في السجل المناسب للاستخدام داخل الدالة.

الكود المعدل يبدو كما يلي:

assembly
section .text global _start ; دالة لطباعة قيمة المعلمة my_function: ; استخراج المعلمة من الستاك pop eax ; استخدام قيمة المعلمة في عملية ما ; على سبيل المثال، يمكنك استخدام المعلمة في تحديد ما إذا كان العدد يقبل القسمة على 2 test eax, 1 ; اختبار عدم التماثل لتحديد ما إذا كان العدد فرديًا أو زوجيًا jz even ; قفز إلى even إذا كان العدد زوجيًا ; إذا كان العدد فرديًا، قم بطباعة رسالة mov ebx, 1 ; معلمة للطباعة عبر النظام mov eax, 4 ; رقم استدعاء النظام للطباعة mov ecx, msg_odd ; عنوان الرسالة للطباعة mov edx, len_msg_odd ; طول الرسالة int 0x80 ; استدعاء النظام jmp end_prog ; الانتقال إلى نهاية البرنامج even: ; إذا كان العدد زوجيًا، قم بطباعة رسالة mov ebx, 1 ; معلمة للطباعة عبر النظام mov eax, 4 ; رقم استدعاء النظام للطباعة mov ecx, msg_even ; عنوان الرسالة للطباعة mov edx, len_msg_even; طول الرسالة int 0x80 ; استدعاء النظام end_prog: ret _start: ; ضع قيمة المعلمة (على سبيل المثال، 5) على الستاك push 5 ; ادع الدالة لتحليل المعلمة وطباعة رسالة وفقًا للنتيجة call my_function ; اخرج من البرنامج mov eax, 1 ; رقم استدعاء النظام للخروج من البرنامج xor ebx, ebx ; كود خروج 0 int 0x80 ; استدعاء النظام

في هذا المثال، يتم وضع المعلمة (العدد 5 في هذه الحالة) على الستاك باستخدام push قبل استدعاء الدالة. داخل الدالة my_function، يتم استخراج قيمة المعلمة من الستاك باستخدام pop وتخزينها في السجل eax للاستخدام في الدالة.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر