ورود

View Full Version : سوال: مشکل stack در اجرای یک تابع تو در تو



m.j_banitaba
سه شنبه 30 تیر 1394, 14:00 عصر
با سلام ، خدمت دوستان و اساتید محترم
من یک bootloader با fasm نوشتم که یک کرنل دو مرحله ای رادر حافظه بار گذاری می کند. سپس کد کرنل بخش exe خود را در آدرس 0x01000000 کپی کرده و با تنظیم stack اجرا را به entrypoint فایل exe می دهد تا اینجای کار مشکلی وجود ندارد مشکل در اجرای فایل exe می باشد اگر تابع test فایل exe با عدد بزرگ اجرا شود با وجود اینکه stack همچنان فضای کافی دارد اما esp دچار اختلال می شود و آدرس بازگشت دچار اختلال شده و اجرا از دست می رود . من نتوانستم علت آن را بفهمم.
در ضمن من از tcc جهت تولید فایل exe استفاده کرده ام.
نحوه کار mkflp2.py نیز به این صورت است که یک فلاپی فرمت شده با fat12 را باز کرده mbr را بر روی آن کپی می کند.
پیشا پیش از توجه دوستان تشکر می کنم.

pswin.pooya
چهارشنبه 31 تیر 1394, 14:23 عصر
با سلام ، خدمت دوستان و اساتید محترم
من یک bootloader با fasm نوشتم که یک کرنل دو مرحله ای رادر حافظه بار گذاری می کند. سپس کد کرنل بخش exe خود را در آدرس 0x01000000 کپی کرده و با تنظیم stack اجرا را به entrypoint فایل exe می دهد تا اینجای کار مشکلی وجود ندارد مشکل در اجرای فایل exe می باشد اگر تابع test فایل exe با عدد بزرگ اجرا شود با وجود اینکه stack همچنان فضای کافی دارد اما esp دچار اختلال می شود و آدرس بازگشت دچار اختلال شده و اجرا از دست می رود . من نتوانستم علت آن را بفهمم.
در ضمن من از tcc جهت تولید فایل exe استفاده کرده ام.
نحوه کار mkflp2.py نیز به این صورت است که یک فلاپی فرمت شده با fat12 را باز کرده mbr را بر روی آن کپی می کند.
پیشا پیش از توجه دوستان تشکر می کنم.

فایل exe شما با زبان C هست؟
دقیقا قالب فایل exe هست؟
آدرسها رو در لینکر تنظیم کردین؟

m.j_banitaba
چهارشنبه 31 تیر 1394, 15:57 عصر
گفتم مشکل مال exe نیست کد ذیل رو در kernel.bin که با fasm کامپایل شده قرار دادم . وقتی esp به اندازه 0x100000 کاهش پیدا می کنه برنامه به مشکل می خوره:

mov eax,0x00080000mov edx,esp
call recu
recu:
sub edx,4
cmp edx,esp
jnz recu_error
dec eax
jz recu_else
call recu
jmp recu_ret
recu_else:

recu_ret:
cmp edx,esp
jnz recu_error
add edx,4
ret




recu_error:



مقدار eax تا 0x40000 برنامه را به درستی به پایان می برد اما اگر eax هر مقداری بیشتر قرار بگیرد مقدار stack توسط فرایندی که نمی دونم باز نویسی می شه

m.j_banitaba
سه شنبه 06 مرداد 1394, 11:25 صبح
کد بالا تو vmware l مشکل داره و تو bochs کد درست اجرا می شه.

m.j_banitaba
سه شنبه 06 مرداد 1394, 18:30 عصر
باآخرین تستی که انجام دادم این مشکل مربوط میشه به تعدادی دستور ret پشت سر هم.


mov ecx,0x03000000
mov ebx,test_loop1_2
test_loop1_1:
push ebx
loop test_loop1_1
test_loop1_2:
cmp [esp],ebx
jz test_loop1_3
mov eax,esp
call hex_eax
jmp test_end
test_loop1_3:
ret
test_end:

m.j_banitaba
پنج شنبه 08 مرداد 1394, 09:55 صبح
مشکل مربوط می شد به a20 تنظیمش نکرده بودم.