PDA

View Full Version : نمایش محتویات یک رجیستر در cpp



deopen
سه شنبه 12 آذر 1387, 00:22 صبح
فکر کنم از عنوان تاپیک منظور من کاملا واضح باشد, برای نمایش محتویات یک رجیستر در cpp چه باید کرد؟

برای مثال :


int main() {
__asm {
mov ah,12h
}
//cout "ah" register ??!!

return 0;
}

در این کد برای نمایش محتویات رجیستر ah باید چه کار کنم؟؟

Mehdi Asgari
سه شنبه 12 آذر 1387, 01:32 صبح
short myVariable = 0;
__asm
{
mov AH,1
mov AL,2
// some calculations here
mov myVariable,AX
}
cout << myVariable << endl;
باید عدد 258 چاپ بشه (0x0102)

amir_civil
سه شنبه 12 آذر 1387, 12:58 عصر
سلام
اگر نخاهیم از اسمبلی استفاده کنیم چی:؟
مستقیما مثلا مقدار esp رو بدست بیاریم یا تغیرش بدیم

deopen
سه شنبه 12 آذر 1387, 14:05 عصر
باید عدد 258 چاپ بشه (0x0102)


یعنی 01 در AH(بایت بالایی) ریخته شده و 02 در AL (بایت پایینی)و ax=0x0102 .
متشکرم.

؟؟ :
پس نوع short برابر word میباشد, آیا در cpp نوعی هم اندازه بایت داریم؟؟ که اگر داشته باشیم میتوانیم مستقیما مقدار ah یا al را درون متغیرمان قرار دهیم.



int main() {
//ByteSize myVar;

__asm {
mov ah,1
mov myVar,ah
}
//cout "ah" register ??!!
cout<<myVar;
return 0;
}



اگر نخاهیم از اسمبلی استفاده کنیم چی:؟

بله , آیا ما در cpp بدون استفاده از اسمبلی هم میتوانیم مقداری رو به رجیستری پاس بدهیم؟

deopen
سه شنبه 12 آذر 1387, 14:16 عصر
همین حالا در MSDN نوع int8__ رو پیدا کردم که یک بایت از حافظه رو اشغال میکنه و البته از 128_ تا 127 و نوع
بی علا متش (unsigned) یک unsigned قبل int8__ رو دارا میباشد که از 0 تا 255 رنج عددی آن است .



int main() {
unsigned __int8 myVar;//0 to 255
__asm {
mov ah,97
mov myVar,ah
}
//cout "ah" register ??!!
cout<<myVar;
cin.get();
return 0;
}




Data Type Size

int (unsignedint) 4 byte of memory ==>quad word
__int8 (unsigned__int8) 1 byte of memory ==>byte
__int16 (unsigned__int16) 2 byte of memory ==>word
__int32 (unsigned__int32) 4 byte of memory ==>quad word
__int64 (unsigned__int64) 8 byte of memory ==>paragraph
short (unsignedshort) 2 byte of memory ==>word
long (unsignedlong) 4 byte of memory ==>quad word
longlong (unsignedlonglong) 8 byte of memory ==>paragraph
double 8 byte of memory ==>paragraph




حال فقط یک سوال باقی مانده, برای مقدار دهی یک رجیستر در خود cpp چه کار باید کرد؟؟

Nima_NF
سه شنبه 12 آذر 1387, 16:49 عصر
برای 1 بایت لزوما نیاز نیست از int8__ استفاده کنید، می توانید از char, unsigned char, signed char استفاده کنید، چرا که برخلاف اسم آن فقط برای تعریف کارکتر نیست.

برای مقدار دهی خود رجیستر هم به همان شکلی که دوستان برایتان مثال زدند در طرف دوم mov نام متغیر خود را بنویسید:



mov ah, myVar

amir_civil
سه شنبه 12 آذر 1387, 17:58 عصر
mov ah, myVar
بدون استفاده از اسمبلی هم میشه این کار رو کرد؟

Mehdi Asgari
سه شنبه 12 آذر 1387, 21:08 عصر
بدون استفاده از اسمبلی هم میشه این کار رو کرد؟
نه .

Nima_NF
سه شنبه 12 آذر 1387, 21:34 عصر
mov ah, myVarبدون استفاده از اسمبلی هم میشه این کار رو کرد؟

وقتی ما از زبان های سطح بالاتر از اسمبلی استفاده می کنیم که نمی خواهیم به طور مستقیم با رجیسترها کار کنیم، بلکه می خواهیم در قالب شیوه دیگری به شکل ساده تر به اهداف خود برسیم (بدون دستکاری مستقیم رجیسترها توسط خودمان)

هدف شما از دادن اطلاعات به رجیستر ها چه هست؟ اسمبلی برای این این کار است، در بالای آن نیز ++C قرار دارد.

نهایتا هدف ما آن است که می خواهیم دو تکه از عددی را به هم چسبانده و در داخل یک متغیر بریزیم. در ++C فقط می نویسیم = و تمام، و برای چسباندن نیز باز به رجیستر نیاز نداریم و با شیفت شانزده بیتی و AND کار تمام می شود.
معادل اسمبلی دستورات زیر را مشاهده کنید:




#define MAKELONG(a, b) ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) |
((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16))


short y = 2;

004117DE mov eax,2
004117E3 mov word ptr [y],ax

int x = MAKELONG(1, y);

004117E7 movsx eax,word ptr [y]
004117EB and eax,0FFFFh
004117F0 movzx ecx,ax
004117F3 shl ecx,10h
004117F6 or ecx,1
004117F9 mov dword ptr [x],ecx

result --> x = 0x00020001

فرق بین ++C و اسمبلی در همین است. یعنی با روش های ساده تر.(ضمن اینکه اسمبلی همچنان در کنار آن موجود است)

deopen
سه شنبه 12 آذر 1387, 21:52 عصر
مرسی از همه .

kitten
سه شنبه 12 آذر 1387, 22:26 عصر
سلام
اگر نخاهیم از اسمبلی استفاده کنیم چی:؟
مستقیما مثلا مقدار esp رو بدست بیاریم یا تغیرش بدیم
ُسلام دوست عزیز
یه مدتی من روی این موضوع کار می کردم و دو راه برای ان پیدا کردم
می تونی از توابع داخل dll ها استفاده کنی ( شخصا از این روش خوشم نمی یاد با این که راحت تره)
می تونی از تابع system و با استفاده از دستور reg در cmd استفاده کنی
برای دیدن طرز استفاده می تونی در cmd بزنی

reg/?مثلا اگه من بخوام یه مقدار را در رجیستری اضافه کنم از از این دستور استفاده می کنم

reg add ادرس /v نام /t نوع فایل /d مقدار
یعنی تو سی پلاس پلاس می نویسیم

system(reg add ادرس /v نام /t نوع فایل /d مقدار);

Mehdi Asgari
سه شنبه 12 آذر 1387, 22:35 عصر
لطفا اول سوالو خوب بفهمید بعد اظهار نظر کنید.
دستور reg جزو دستورات کامند پرامپت ویندوز هست که برای تغییر رجیستری به کار میره و ربطی به سوال ایشون (تغییر در رجیستر های سی پی یو) نداره
http://commandwindows.com/reg.htm

kitten
سه شنبه 12 آذر 1387, 22:38 عصر
خوب دوست عزیز مگه من چیزی غیر از این گفتم
جالبه ها