PDA

View Full Version : nasm



stowmco
سه شنبه 03 بهمن 1385, 07:16 صبح
چطور میتونم در nasm به طور مستقیم با حافظه کار کنم
به این صورت
mov 0b8000H,65
mov 0b8001H,14
کاپایلر nasm خطا میده
و همین طور برای استفاده از دستور lea

civ0003
دوشنبه 21 اسفند 1385, 15:48 عصر
سلام.
من با nasm تا حالا کار نکردم و نمیدونم اصول کلی که در اسمبلرها یی که من باهاشون کارکردم در این یکی هم رعایت میشه یا نه. البته این اصول کلی جزو ریشه ی اسمبلیه و گمون نمیکنم فرقی وجود داشته باشه هرچند ممکن طراحان اسمبلرهای متفاوت برای سهولت کار یه سری تغییرات هوشمندی در آدرس دهی در اسمبلر خودشون داده باشن ! خوب با این حال:
شما نمیتونید یه داده رو به طور مستقیم به یه آدرس منتقل کنید. چون CPU انتقال مستقیم از یک محل ram به محل دیگری از اون رو انجام نمیده. از طرفی برای آدرس دهی یک قسمت از ram باید از یکی از روشهای آدرس دهی صحیح استفاده کنید. به طور کلی شکلهای صحیح استفاده از mov به صورت زیر هستن:
mov reg1,reg2
mov reg,mem
mov mem,reg
که reg یک ثبات عمومی و mem یک آدرس از ram هستن. و چند روش هم برای آدرس دهی حافظه وجود داره. مثلا میتونید آدرس مورد نظر رو به ثبات ebx وارد کنید و بعد از [ebx] به عنوان یک آدرس دهی استاندارد به نقطه ی مورد نظر استفاده کنید. به این ترتیب شما باید داده ی خودتون رو اول به یک ثبات عمومی ( متناسب با اندازه داده باید ثبات انتخاب بشه) و بعد از ثبات به یک آدرس صحیح ram منتقل کنید از قبل آدرس مورد نظر رو هم وارد ebx کنید. مثلا :
mov ah,65
mov ebx,0b8000h
mov [ebx],ah
امیدوارم توضیحاتم بدرد خورده باشه!

Younes
سه شنبه 22 اسفند 1385, 13:37 عصر
سلام
منهم تا حال با این برنامه کار نکردم ولی شاید اگر آدرسها را داخل [ ] بگذارید کار کند.

__H2__
چهارشنبه 23 اسفند 1385, 12:44 عصر
سلام
من چند سال قبل باش کار کردم، برنامه جالبیه، فقط سه سال است ورژن جدید نداده!

من هم مثل کاربر Younes گمان میکنم باید از چیزی شبیه زیر استفاده کنید.


mov eax,dword ptr[123456]


البته اگر منظورتان ریختن مستقیم در حافظه است، چون خیلی وقت گذشته و اسمبلی کار نکرده ام یادم نمی آید و باید چک کنید اصلا همچین روش آدرس وجود دارد؟ (البته گمام میکنم درست باشد)
اگر نشد یکی از طرفین را (مقدار یا آدرس) در eax قرار دهید.

civ0003
چهارشنبه 23 اسفند 1385, 15:00 عصر
سلام.
_H2_ گفته میتونی یکی از طرفین رو به eax منتقل کنی ولی این فقط اگر مقدار ثابت رو به eax منتقل کنی حرف درستیه. چون انتقال آدرس به این ثبات هیچ فایده ای نداره. این هم به این دلیل که ثبات eax در آدرسدهی به طور مستقیم و تنهایی کاربردی نداره و اگر بخوای ازش استفاده کنی باید از یه روش complex آدرسدهی استفاده کنی که هم پیچیده تره و هم زمان بیشتری از cpu میگیره. در آدرسدهی تنها ثبات عمومی که کاربرد مستقیم داره ebx هستش. در حالت دوم هم که اساس نظر _H2_ پیش میاد یعنی انتقال ثابت به eax نهایتا باز مشکل آدرسدهی برای ram باقی میمونه که برای حلش باید بری سراغ انواع روشهای آدرسدهی که . . .

__H2__
پنج شنبه 24 اسفند 1385, 14:49 عصر
سلام.
_H2_ گفته میتونی یکی از طرفین رو به eax منتقل کنی ولی این فقط اگر مقدار ثابت رو به eax منتقل کنی حرف درستیه. چون انتقال آدرس به این ثبات هیچ فایده ای نداره. این هم به این دلیل که ثبات eax در آدرسدهی به طور مستقیم و تنهایی کاربردی نداره و اگر بخوای ازش استفاده کنی باید از یه روش complex آدرسدهی استفاده کنی که هم پیچیده تره و هم زمان بیشتری از cpu میگیره. در آدرسدهی تنها ثبات عمومی که کاربرد مستقیم داره ebx هستش. در حالت دوم هم که اساس نظر _H2_ پیش میاد یعنی انتقال ثابت به eax نهایتا باز مشکل آدرسدهی برای ram باقی میمونه که برای حلش باید بری سراغ انواع روشهای آدرسدهی که . . .

سلام
من گفتم خیلی وقت است اسمبلی کار نکرده ام ولی هنوز ... :چشمک:
اگر درست متوجه شده باشم، نتیجتاَ شما میگویید دستور [mov ebx,[eax غلط است، اگر این طور است باید بدانید نرم افزار nasm دستوری شبیه این را را به راحتی کامپایل میکند.
فکر کنم مشکل شما این است که فقط با روش های آدرس دهی 8086 آشنایی دارید در حالی که امکانات بسیاری به پردازنده های پنتیوم اضافه شده.

ضمنا چون برای اطمینان بررسی کردم متوجه شدم ریختن مستقیم در حافظه با آدرس مستقیم نیز مجاز است

مثلاَ دستوررات زیر همگی به راحتی کامپایل میشوند.


mov eax,123
mov dword[eax],25


mov dword[12],25


درنتیجه دوستمان آقای stowmco (http://www.barnamenevis.org/forum/member.php?u=32113) میتواند از دستور mov dword [0b8000H],65 استفاده کند.
بای.