PDA

View Full Version : سوال: ترکیب ++C و Assembly



woeful
سه شنبه 07 اردیبهشت 1389, 20:37 عصر
این عکس رو نگاه کنید چرا error میده ؟؟
http://up.iranblog.com/Files/7e38847ff7ac4cc3a8df.JPG

tdkhakpur
سه شنبه 07 اردیبهشت 1389, 21:25 عصر
به این شکلی اصلاح کنید.


__asm{
mov eax, 05h
}

woeful
سه شنبه 07 اردیبهشت 1389, 22:30 عصر
به این شکلی اصلاح کنید.


__asm{
mov eax, 05h
}


http://up.iranblog.com/Files/61cb235be73e4754a615.JPG

:ناراحت: با Dev Cpp هم امتحان کردم همین طوری بود اما با Vsiual studio که امتحان کردم درست شد فک کنم این روش مال visual ++C هست آیا برای Dev cpp و C-free راهی هست ( حتما هست )

اگه به عکس اول نگاه کنید error عجیبی میده
اینم داخل Dev cpp


http://up.iranblog.com/Files/c4f023b1117d4b2399f8.JPG

r00tkit
سه شنبه 07 اردیبهشت 1389, 22:45 عصر
syntax اسمبلی در visual c++ اینتل هستش و Dev c++ نیز از AT&T استفاده می کنه

woeful
چهارشنبه 08 اردیبهشت 1389, 21:01 عصر
syntax اسمبلی در visual C++‎ اینتل هستش و Dev C++‎ نیز از AT&T استفاده می کنه
سلام

میشه یه کامپایلر غیر ماکروسافتی معرفی کنید که intel رو پشتیبانی کنه؟؟:کف:

hoax3r
پنج شنبه 09 اردیبهشت 1389, 00:14 صبح
دستور خودت تقریبا درسته فقط اعداد هگز با 0x شروع میشه بدون h مثل این


__asm ("mov eax, 0x05");


موقع کامپایل باید این آرگومان به gcc داده بشه تا سینتکش intel رو قبول کنه،
من با ++Dev-C کار نکردم بدونم کجا میتونی تنظیم کنی، ولی بعد اینکار مشگلت حل میشه


-masm=intel

woeful
پنج شنبه 09 اردیبهشت 1389, 21:11 عصر
دستور خودت تقریبا درسته فقط اعداد هگز با 0x شروع میشه بدون h مثل این


__asm ("mov eax, 0x05");
موقع کامپایل باید این آرگومان به gcc داده بشه تا سینتکش intel رو قبول کنه،
من با ++Dev-C کار نکردم بدونم کجا میتونی تنظیم کنی، ولی بعد اینکار مشگلت حل میشه


-masm=intel


سلام
این دستوری که شما دادین فک کنم مال کامپایلر های خط فمانه ( که من داخل ویندوز ندیدم)

احتمالا مال linux هست درسته ؟؟


-----------------------------------------

یعنی هیچ راهی نیست Assembly به سبک intel رو داخل یه IDE با ++C بجز Vsiual ++C داخل سیستم عامل Windows نوشت؟؟:متفکر:

hoax3r
جمعه 10 اردیبهشت 1389, 09:35 صبح
سلام
این دستوری که شما دادین فک کنم مال کامپایلر های خط فمانه ( که من داخل ویندوز ندیدم)

احتمالا مال linux هست درسته ؟؟


-----------------------------------------

یعنی هیچ راهی نیست Assembly به سبک intel رو داخل یه IDE با ++C بجز Vsiual ++C داخل سیستم عامل Windows نوشت؟؟:متفکر:

خوب این IDE هایی هم که شما استفاده می کنید پوسته ای هست روی کامپایلر های خط فرمان دیگه، ++Dev-C میدونم gcc است ولی c-free نمیدونم پیشفرض از چی استفاده مکینه چون اولین باره میبینمش

خوب مجبور شدم ++dev-c رو نصب کنم، به هر به جای توضیح چنتا عکس میزارم

http://www.barnamenevis.org/forum/attachment.php?attachmentid=48158&stc=1&d=1272600735

برای تنظیم کامپایلر در ++dev-c از منوی Tools گزینه Compiler Options رو بزنید مثل عکس تنظیم کنید

http://www.barnamenevis.org/forum/attachment.php?attachmentid=48159&stc=1&d=1272600735

woeful
جمعه 10 اردیبهشت 1389, 09:55 صبح
خوب این IDE هایی هم که شما استفاده می کنید پوسته ای هست روی کامپایلر های خط فرمان دیگه، ++Dev-C میدونم gcc است ولی c-free نمیدونم پیشفرض از چی استفاده مکینه چون اولین باره میبینمش

خوب مجبور شدم ++dev-c رو نصب کنم، به هر به جای توضیح چنتا عکس میزارم

http://www.barnamenevis.org/forum/attachment.php?attachmentid=48158&stc=1&d=1272600735

برای تنظیم کامپایلر در ++dev-c از منوی Tools گزینه Compiler Options رو بزنید مثل عکس تنظیم کنید

http://www.barnamenevis.org/forum/attachment.php?attachmentid=48159&stc=1&d=1272600735

من از شما خیلی ممنونم :چشمک::بوس: درست شد ولی :ناراحت:

آیا روش دیگه ای نیست مثلا داخل Visual ++C این کد جواب میده :


#include "stdafx.h"
#include "iostream"
#include "conio.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
int a = 5; int b = 6; int sum =0;
_asm
{
mov eax,a
mov ebx,b
add eax,ebx
mov sum,eax
}
cout<<"This is a+b in assmbly: "<< sum;
getch();
return 0;
}

ولی در Dev cpp نه :


#include<iostream>
#include<conio.h>
using namespace std;
int main()
{
int a = 5; int b = 6; int sum =0;
__asm ("mov eax,a");
__asm ("mov ebx,b");
__asm ("add eax,ebx");
__asm ("mov sum,eax");

getch();
return 0;
}

حتما فهمیدین مشکل کجاست

در Dev cpp من نمیتونم به متغییر هایی که در برنامه تعریف کردم دست پیدا کنم چون کد های Assembly درون رشته نوشته میشمه و linker ارور میده

حالا چیکار کنم ؟؟:متفکر:

ببخشید سوال زیاد میکنم!!

hoax3r
جمعه 10 اردیبهشت 1389, 13:50 عصر
به نظر میاد متغییر های محلی با اون شکل و سادگی که تو ++VC استفاده میشه در gcc نمیشه استفاده کرد
اگه بخواین به اون شکل استفاه کنید باید متغییر ها به صورت استاتیک تعریف بشن
مثلا اگه کدتون رو به این تغییر بدین درست میشه، قبل متغییر ها هم یه آندرلاین قرار میگیره


#include<iostream>
#include<conio.h>
using namespace std;

int a = 5; int b = 6; int sum =0;

int main()
{
__asm ("mov eax,_a");
__asm ("mov ebx,_b");
__asm ("add eax,ebx");
__asm ("mov _sum,eax");

getch();
return 0;
}


ولی در حالتی که متغییر به صورت محلی تعریف شده باشه دو تا کار میشه کرد
1 - بجای نام باید با استفاده از esp یا ebp بصورت مستقیم به متغییر در استک دسترسی پیدا کرد که مثلا کدتون به این شکل میشه


#include<iostream>
#include<conio.h>
using namespace std;
int main()
{
int a = 5; int b = 6; int sum =0;
__asm ("mov eax,[ebp-4]");
__asm ("mov ebx,[ebp-8]");
__asm ("add eax,ebx");
__asm ("mov [ebp-0xc],eax");

getch();
return 0;
}


2 - استفاده از روشی به نام Extended Inline Assembly که من با این روش کار نکردم برای همین یه لینکی میزارم ببینیدش شاید بدردتون بخوره


http://www.codeproject.com/KB/cpp/extasm.aspx

woeful
جمعه 10 اردیبهشت 1389, 17:32 عصر
بجای نام باید با استفاده از esp یا ebp بصورت مستقیم به متغییر در استک دسترسی پیدا کرد که مثلا کدتون به این شکل میشه


#include<iostream>
#include<conio.h>
using namespace std;
int main()
{
int a = 5; int b = 6; int sum =0;
__asm ("mov eax,[ebp-4]");
__asm ("mov ebx,[ebp-8]");
__asm ("add eax,ebx");
__asm ("mov [ebp-0xc],eax");

getch();
return 0;
}


میشه این esp ebp یه توضیح بدید از کجا فهمیدن کجای STACK قرار میگیره؟؟

اینجوری خیلی سخته شما لطفا یه مثال از وقفه 21h و ah=09 بزن که یه پیغام نشون بده

خدا پدر بیل گیتس رو بیامرزه

hoax3r
جمعه 10 اردیبهشت 1389, 18:07 عصر
میشه این esp ebp یه توضیح بدید از کجا فهمیدن کجای STACK قرار میگیره؟؟


خوب اینکه چطوری اون متغییر ها در استک قرار میگیره بر میگرده به اسمبلی که بهتره یه کتاب در این زمینه پیدا کنید
ولی حالا اگه پول برای کتابم نخواستین بدین تا اینجا هم اومدین یه عکس پیدا کردم که خیلی خوب این مساله رو نشون میده
http://www.barnamenevis.org/forum/attachment.php?attachmentid=48200&stc=1&d=1272630953

مهم اونجایی که نوشته save ebp و میبینید که EBP با یک فلش به اون آدرس اشاره میکنه
حالا مقادیری که بالاش قرار گرفته و نوشته local variable آدرسشون 4 بایت 4 بایت از EBP کم میشن
در نتیحه اینجوری میشه بهشون دسترسی پیدا کرد



[ebp-4] --> local varialbe 1
[ebp-8] --> local varialbe 2
...
...


و در مورد مثال شما اینجوری میشه


[ebp-0x4] --> a ( a size = 4 byte )
[ebp-0x8] --> b ( b size = 4 byte )
[ebp-0xc] --> sum ( sum size = 4 byte )



اینجوری خیلی سخته شما لطفا یه مثال از وقفه 21h و ah=09 بزن که یه پیغام نشون بده
تو gcc که نمیشه از این وقفه استفاه کرد، و کلا ارتبطشو به سوالتون که در اولین پسته رو نمیفهمم
به نظرم بهتره تو یه تاپیک جدید این سوال پرسیده بشه