PDA

View Full Version : مبتدی: چگونه به اطلاعات یک خانه از حافظه دست‌یابی پیدا کنیم؟



MostafaMohammadi
چهارشنبه 03 خرداد 1391, 16:15 عصر
من آدرس یک خونه از حافظه رو دارم:


0xFFFF:0x0005

حالا چطور می‌تونم محتویات اش رو بخونم؟

xman_1365_x
یک شنبه 07 خرداد 1391, 15:35 عصر
مجددا انواع آدرس دهی رو مطالعه کنید!

یک مثال:



org 100h

;0xFFFF:0x0005
push dx
;write
mov ax,0ffffh
mov ds,ax
mov bx,0005h
mov al,'X'
mov byte ptr [bx],al

;read
mov al,byte ptr [bx]
pop dx

mov x,al

mov ah,2
mov dl,x
int 21h


; wait for any key....
mov ah, 1
int 21h

mov ax, 4c00h ; exit to operating system.
int 21h
ret


x db ?

end


موفق باشی

xman_1365_x
دوشنبه 08 خرداد 1391, 00:00 صبح
ضمنا من عجله ای نوشتم اشتباه dx رو push و pop کردم اینگاری شما هم حواست نبوده ،درستش pop ds و push ds هست که دیتا سگمنت بهم نریزه!

موفق باشی

MostafaMohammadi
دوشنبه 08 خرداد 1391, 17:38 عصر
راست اش رو بخواهید، من دیدم کسی جواب ام رو نمیده، به خاطر مضیقه زمانی که داشتم منتظر نموندم و رفتم روش‌های آدرس‌دهی اطلاعات رو خوندم، متوجه شدم در آدرس‌دهی‌ها ثبات سگمنت پیش‌فرض DS است که آدرس Data Segment درش ذخیره شده (البته اگر در آدرس دهی از ثبات BP استفاده کنیم، ثبات سگمنت پیش‌فرض SS می شود که آدرس Stack Segment درش ذخیره شده) یعنی وقتی می نویسیم:


MOV AL, VAR1
MOV AL, [BX]
MOV AL, [4000]


در اصل خونده میشه:


MOV AL, DS:VAR1
MOV AL, DS:[BX]
MOV AL, DS:[4000]


کمی بعدتر توضیح داده بود که اگر می خواهیم ثبات سگمنت پیش‌فرض رو تغییر بدیم کافی است، ثبات سگمنت دلخواه مون رو قبل از اضافه کنیم. به طور مثال:

MOV AL, CS:[BX]
من اون موقع فکر نمی کردم بتونم ثبات سگمنت DS رو یه جایی موقتا ذخیره کنم و تغییر اش بدم و از DS جدید استفاده کنم و بعد از استفاده کردن دوباره به مقدار اولیه برش گردونم.
به جاش سریع به ذهن ام رسید که ثبات سگمنت ES تو برنامه های من اکثر مواقع بلااستفاده است، 0FFFFh رو ریختم توی اون و ازش به عنوان ثبات سگمنت پیش فرض استفاده کردم و کارم راه افتاد.
وقتی شما این تاپیک رو جواب دادین، من اومدم یه دور سَر سَری نگاه کردم دیدم ایده اش همونه، فقط آدرس تو DS ریخته شده، دیگه دقت نکردم چی به چیه و یه تشکر زدم و رفتم.