PDA

View Full Version : چاپ محتواي اين ثبات؟



moha//\\//\\ad
شنبه 09 اردیبهشت 1391, 21:28 عصر
سلام
برنامه زير رو در نظر بگيريد





.model small

.data
msg db "Hello world!$"

.code
main:
mov ax, @data
mov ds, ax
mov dx, offset msg
mov ah,9h ;print string in dx
int 21h
mov ah,4ch ;terminate process
int 21h
end main


حالا من ميخوام در كد زير محتواي ثبات eax رو چاپ كنم بايد چكار كنم




.model small

.data


.code
main:
eax,300H
end main



اگه بخوام مثل كد اول پيش برم ميگه اين 32 بيت هست و اون يكي 16 واسه همين نميريزه تو ثبات ديگه كه چاپش كنم

MostafaMohammadi
دوشنبه 11 اردیبهشت 1391, 18:00 عصر
معادل باینری عدد 300H میشه 1100000000 که 10 بیت بیشتر جا نمی گیره، دلیل خاصی داره که یک مقدار 10 بیتی رو توی یک ثبات 32 بیتی ذخیره می کنی؟
اگه دلیل خاصی نداره که بهتره این مقدار رو توی یک ثبات 16 بیتی ذخیره اش کنی تا اصولا همچین مشکلی پیش نیاد.
ولی اگه دلیل خاصی برای این کارت داری، همونطور که گفتی مشکل به خاطر تفاوت سایز ثبات هاست. ساده ترین راه حل اینه که
یه متغیر 32 بیتی تعریف کنی، به این شکل:


MSG DD

بعد از اینکه مقدار 300H رو توی EAX ریختی، EAX رو توی این متغییر 32 بیتی در حافظه ذخیره کنی، بعد آدرس اولین خونه این متغییر در حافظه رو بریزی تو ثبات DX. بعد هم سرویس 9H دستور 21H رو اجرا کنی.
یعنی:



MOV EAX,300H
MOV MSG,EAX
MOV DX,OFFCET MSG
MOV AH,9H
INT 21H

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


توی تاپیک برنامه اسمبلی گرفتن رشته وتبدیل تک تک کاراکترهای آن به کد اسکی (http://barnamenevis.org/showthread.php?338886-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%A7%D8%B3%D9%85%D8%A8%D9%84%DB%8C-%DA%AF%D8%B1%D9%81%D8%AA%D9%86-%D8%B1%D8%B4%D8%AA%D9%87-%D9%88%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%AA%DA%A9-%D8%AA%DA%A9-%DA%A9%D8%A7%D8%B1%D8%A7%DA%A9%D8%AA%D8%B1%D9%87%D 8%A7%DB%8C-%D8%A2%D9%86-%D8%A8%D9%87-%DA%A9%D8%AF-%D8%A7%D8%B3%DA%A9%DB%8C) در مورد دستورهای :
.186
.286
.386
.8087
.8086 پرسیده بودی که من هم در جواب اش گفته بودم:

در صورت نیاز یکی از این دستورها رو در سطور آغازین برنامه می نویسی تا نوع پردازنده رو تعیین کنی، (هر پردازنده ای یک معماری خاصی دارد و زبان ماشین یک معماری با زبان ماشین یک معماری دیگه یکسان نیست) در دانشگاه های ایران معمولا معماری پرکاربرد 80X86 تدریس میشه و به تبع اون کتاب های آموزشی موجود در بازار و مقاله های آموزش زبان اسملی وب فارسی هم برای معماری 80X86 است.ولی به نظر میرسه شما متوجه پاسخ سوال تون نشدین. چون اینجا می بینم که دارین سعی می کنید از ثبات EAX استفاده کنین، در حالی که این ثبات مخصوص پردازنده های مدرن x86 (معماری 386 و بالاتر) است ولی در ابتدای برنامه به این موضوع اشاره نکردین. باید یکی از اون دستور ها رو به کد ات اضافه کنی!
سگمت STACK رو فراموش کردی تعریف کنی، باید این دستور رو به کد ات اضافه کنی:
.STACK
سرویس 9H دستور 21H کاراکتری که کد اسکی اش در خونه حافظه ای که ثبات DX به اون اشاره داره رو در صفحه نمایش نشون میده. اگه شما مقدار 300H رو در خونه حافظه داشته باشید و از سرویس 9H دستور 21H استفاده کنید، سرویس 9H دستور 21H کاراکتری که کد اسکی اش معادل مقدار 300H است رو در صفحه نمایش نشون میده، نه عدد 300H رو. این رو همیشه یادتون باشه که اگه مثلا می خواهید عدد 3 رو در صفحه نمایش چاپ کنید، این مقدار به به صورت معادل باینری عدد 3 ذخیره شده. باید این معادل باینری رو به کد اسکی عدد 3 تبدیل کنید و بعد اون رو چاپ کنید.
سرویس 9H دستور 21H از آدرس حافظه ای که تو DX قرار دادین شروع می کنه خانه های حافظه رو چاپ کردن تا برسه به یک خونه ای که کاراکتر "$" درش باشه، برای همینه که در برنامه اولی که گذاشتی، هنگام تعریف متغیر MSG در انتهای اون یک "$" قرار داده:
msg db "Hello world!$" شما هم اگه می خواهید از سرویس 9H دستور 21H استفاده کنید، باید قبل این که ازش استفاده کنید باید یک جوری انتهای اون یه "$" قرار بدید چون این سرویس برای متوقف شدن نیاز به این داره که به کاراکتر "$" برسه.

xman_1365_x
سه شنبه 12 اردیبهشت 1391, 16:44 عصر
حالا من ميخوام در كد زير محتواي ثبات eax رو چاپ كنم بايد چكار كنم

اگه بخوام مثل كد اول پيش برم ميگه اين 32 بيت هست و اون يكي 16 واسه همين نميريزه تو ثبات ديگه كه چاپش كنم

اگر در 8086 میخواین انجام بدین شما دسترسی به ثبات 32 بیتیی ندارید و باید از تخصیص آدرس 32 بیتی استفاده کنید و اگر هم نیاز به ثبات های 32 دارین در اول کدتون باید .386 رو بنویسید چرا که از 80386 به بعد این ثبات ها و دستورالعمل های مربوطه معرفی شده و شما با این خط به اسمبلر میگین قصد استفاده از این ثبات و اینستراکشن هارو دارین


در صورت نیاز یکی از این دستورها رو در سطور آغازین برنامه می نویسی تا نوع پردازنده رو تعیین کنی، (هر پردازنده ای یک معماری خاصی دارد و زبان ماشین یک معماری با زبان ماشین یک معماری دیگه یکسان نیست) در دانشگاه های ایران معمولا معماری پرکاربرد 80X86 تدریس میشه و به تبع اون کتاب های آموزشی موجود در بازار و مقاله های آموزش زبان اسملی وب فارسی هم برای معماری 80X86 است.

برای تکمیل گفته بالا ، معماری اینتل بکوارد کامپتیبل هست و پردازنده های جدید به طور کامل از پردازنده های قدیم پشتیبانی میکنند،برای همینه شما میتونید 8086 رو در ویندوز شبیه سازی کنید چرا که پردازنده ثباتی برای کنترل این موضوعات داره
و شما فقط با معرفی به اسمبلر میتونید از امکانات پردازنده استفاده کنید
موفق باشید