PDA

View Full Version : خواندن حافظه



hgkhatir
سه شنبه 17 آبان 1384, 14:26 عصر
من می خواخم در داخل برنامه C از طریق اسمبلی حافظه را بخوانم. مثلاً آدرس 4F0E:0F12 را. کسی در این مورد اطلاعاتی دارد؟

M.kavyani
پنج شنبه 19 آبان 1384, 00:58 صبح
شما برای استفاده از دستورات اسمبلی در سی باید به صورت زیر عمل کنید


asm
{
دستورات اسمبلی
}

موفق باشید

aakh1361
پنج شنبه 19 آبان 1384, 02:00 صبح
4F0E:0F12

asm push ds
asm push es

mov ax,4F0E
mov ds,ax

mov si,0F12


mov ax,سگمنت مقصد
mov es,ax
mov di,افست مقصد

mov cx,تعداد بایتهای که می خواهید جابجا شود
rep movsb

pop es
pop ds


شما باید افست و سگمنت مقصد رو مشخص کنید

siosavin
یک شنبه 22 آبان 1384, 09:21 صبح
اگر نخواهیم از یک جای حافظه به یک جای دیگر حافظه بریزیم. بلکه آن را در یک متغیر مثلاً از نوع char بریزیم. چکار باید بکنیم؟

mzjahromi
یک شنبه 22 آبان 1384, 10:50 صبح
char chr1;
asm
{
push ds
push ax
push bx
mov ds,4F0Eh
mov bx,0F12h
mov al,[bx]
move chr1,al
pop bx
pop ax
pop ds
}

siosavin
یک شنبه 22 آبان 1384, 11:08 صبح
من این برنامه را در VC++ تست کردم.

یک خطای illegal reference to 16-bit data in 'second operand در خط mov al,[bx] ایجاد می‌شود.

همچنین خطای inline assembler syntax error in 'opcode'; found 'chr1' در خط move chr1,al ایجاد می‌شود.

mzjahromi
یک شنبه 22 آبان 1384, 11:25 صبح
اونها رو دیگه باید خودت بررسی کنی
آخه اینا چیزائی هست که من از 6 7 سال پیش یادم مونده. ولی راهش یه چیزی شبیه به همینه در مورد خطای دوم میتونید آخر سر بنویسید


char chr1;
asm
{
push ds
push bx
mov ds,4F0Eh
mov bx,0F12h
mov al,[bx]
move chr1,al
pop bx
pop ds
}
chr1=_AL;

siosavin
یک شنبه 22 آبان 1384, 16:50 عصر
کسی نظر دیگه‌ای ندارد؟

M.kavyani
یک شنبه 22 آبان 1384, 22:01 عصر
کسی نظر دیگه‌ای ندارد؟
منظورتون چیه؟؟؟!! :متعجب: دوستان که به این زیبایی و کاملی پاسخ دادن؟ اگر جایی برای شما ابهام امیز است بیان کنید تا دوستان مشکل شما رو هم رفع کنند! :عصبانی:

aakh1361
دوشنبه 23 آبان 1384, 02:41 صبح
دوستمان یک ای اضافه گذاشته بود


mov al, byte ptr [bx]
mov chr1,al

hgkhatir
دوشنبه 23 آبان 1384, 09:34 صبح
منظورتون چیه؟؟؟!! :متعجب: دوستان که به این زیبایی و کاملی پاسخ دادن؟ اگر جایی برای شما ابهام امیز است بیان کنید تا دوستان مشکل شما رو هم رفع کنند! :عصبانی:

خیلی عصبانی نباش. siosavin راست می‌گوید. من خودم مثالها را تست کردم در vc++ 6 جواب نمی دهد. حتی گزینه mov al, byte ptr [bx] را هم تست کردم. خطای زیر رخ می‌دهد.

illegal reference to 16-bit data in 'second operand'

پس مشاهده می‌کنید که پاسخها کامل نیستند.

seyedof
دوشنبه 23 آبان 1384, 11:19 صبح
سلام
چون به صورت ۱۶ بیتی آدرس دهی کردید. این کد توی داس کار میکنه. باید بنویسید

mov al,byte ptr [ebx]

ضمنا ویندوز یک سیستم عامل Protected Mode است و شما فقط به فضای حافظه پروسس خودتون میتونید دسترسی داشته باشید نه به هر جای حافظه.
ممنون علی

aakh1361
دوشنبه 23 آبان 1384, 23:10 عصر
خیلی عصبانی نباش. siosavin راست می‌گوید. من خودم مثالها را تست کردم در vc++ 6 جواب نمی دهد. حتی گزینه mov al, byte ptr [bx] را هم تست کردم. خطای زیر رخ می‌دهد.

illegal reference to 16-bit data in 'second operand'

پس مشاهده می‌کنید که پاسخها کامل نیستند.
بله شما درست میگید این کد در ویژال سی اجرا نمیشه چون این کد یک قطعه کد 16 بیتی هست !! :چشمک:
اگر به ادرسی که دوستمون گفته توجه کنید می بینید که ایشون منظورشان داس بوده
دقت کنید
سگمنت 4F0E
افست 0F12
این نوع ادرسی دهی فقط در محیط داس مورد قبول هست نه در محیط ویندوز چون محیط ویندوز 32 بیتی هست و شیوه ادرس دهی ان فرق می کنه

باز سوالی هست ؟ :لبخند: