PDA

View Full Version : دستورات ورودی خروجی-خطوط اجباری برنامه-جمع-مشاهده محتوی ثبات



confesseur
چهارشنبه 13 مرداد 1389, 16:12 عصر
سلام و خسته نباشید
من بعد از قبول شدن در پاسکال و سی اسمبلی رو گرفتم
1-اولا ظاهرا یه سری خطوط هست در برنامه که حتما باید باشن توی فایل asm . خب این خطوط چی هست . لطف میکنید یه برنامه ساده با تعداد کمترین خط ممکن رو بنویسید که من بتونم اجراش کنم.
2-واقعا موندم دستوارات ورودی خروجی تو اسمبلی چیه (کل فروم و کتاب رو گشتم نبود)؟
3-تو کتاب گفته اگر 2345 و 3219 رو جمع کنید مقادیر ثبات ها نظیر sf zf pf cf af of مقادیر صفر رو میگرن . من از طریق debug r نتوستم اینارو ببینم ؟ راهی هست؟ کلا کدی هست که باید من رو کامپیوتر نتیجشونو ببینم
4-اصلا چرا باید با ثبات ها کار کنیم؟ و فک کنم این ثبات ها در مدی که با ویندوز کار میکنیم مدام مقادیرشون تغییر کنه نه؟

ضمنا اگر فک میکنید توضیحی هست که بدرد مبتدی میخوره بگید
اگه بدونید سر obj exe asm کردن چی کشیدم
تشکر بچه ها

tdkhakpur
چهارشنبه 13 مرداد 1389, 22:55 عصر
1
-اولا ظاهرا یه سری خطوط هست در برنامه که حتما باید باشن توی فایل asm . خب این خطوط چی هست . لطف میکنید یه برنامه ساده با تعداد کمترین خط ممکن رو بنویسید که من بتونم اجراش کنم.

مانند پاسکال و سی این خطوط بدنه اصلی برای زبان اسمبلی هست و اساسا این دستورات و خطوط کدهای اساسی برای کامپایل هستند بنابر این دانستن انها تاثیری در تحلیل برنامه و برنامه نویسی شما ندارد و فقط باید این خطوط را قید کنید.


;extrn proc1:far
stacksg segment para stack 'stack'
stacksg ends
datasg segment para 'data'
text db 'hello','$'
datasg ends
codes segment para 'code'
proc1 proc far
// اینجا کد را بنویسید
mov ah,09h
lea dx, text
int 21h
retf
proc1 endp
main proc far
assume ss:stacksg, ds:datasg, cs:codes
mov ax, datasg
mov ds, ax
;------------ ur programm
call proc1
;------------ end of program
mov ax, 4c00h
int 21h
main endp
codes ends
end main



2-واقعا موندم دستوارات ورودی خروجی تو اسمبلی چیه (کل فروم و کتاب رو گشتم نبود)؟

ورودی و خروجی توسط وقفه ها انجام میشود مانند بالا که با استفاده وقفه 21h یک رشته را چاپ میکند.

3-تو کتاب گفته اگر 2345 و 3219 رو جمع کنید مقادیر ثبات ها نظیر sf zf pf cf af of مقادیر صفر رو میگرن . من از طریق debug r نتوستم اینارو ببینم ؟ راهی هست؟ کلا کدی هست که باید من رو کامپیوتر نتیجشونو ببینم

فکر کنم برای کار trace از Emu86 استفاده کنید.

4-اصلا چرا باید با ثبات ها کار کنیم؟
به فرض وقتی شما یک تابعی به زبان سی یا پاسکال مینویسید میتوانید به تابع پارامتر ارسال کنید تا داخل تابع ازش استفاده کنید و در اینجا هم ثباتها میتوانند به عنوان پارامتر مورد استفاده قرار بگیرند همانطور که وقفه ها از انها به عنوان پارامترهای خود استفاده میکنند


و فک کنم این ثبات ها در مدی که با ویندوز کار میکنیم مدام مقادیرشون تغییر کنه نه؟

نه ارتباطی به ویندوز ندارد مدی که به ان سوئیچ کنید از رجیسترها مواظبت میکنند.

yaseriran
پنج شنبه 14 مرداد 1389, 11:11 صبح
درود!

8086 Emulator را نصب کنید، خودش چندین نمونه کد دارد.

confesseur
پنج شنبه 14 مرداد 1389, 20:21 عصر
مجددا سلام
یه تشکر سراسری از tdkhakpur (http://barnamenevis.org/forum/search.php?do=finduser&u=99732) من تعداد پست ها و تعداد تشکر هایی رو که از شما شده نشونه شخصیت قویه شما میدونم و همین طور yaseriran نارنین
یه سوال برام پیش اومد
من توی کتاب مهندس جعفرنژاد قمی دیدم گفته برای انتقال مکان نما به این صورت عمل کنید:
mov ah,2h
mov dh,10
mov dl,15
mov bh,0
int 10h
حالا سوالم اینه چرا یه روند به این سادگی اینقد سخت شده؟ایا به خاطر قدیمی بودنه این زبانه؟
مثلا نمیشد بگن مثلا :
enteghal x,y
مثل خیلی از زبونای دیگه که در حقیقت خود کامپایلر اینارو می برد تو ثبات های مورد نظر
و سوال دومم اینه با توجه به مبتدی بودنم خیلی سخت احساس میکنم این مطلب رو که یادم باشه برای هر کاری ثبات رو با چه مقداری مقدار دهی کنم

tdkhakpur
پنج شنبه 14 مرداد 1389, 23:19 عصر
حالا سوالم اینه چرا یه روند به این سادگی اینقد سخت شده؟ایا به خاطر قدیمی بودنه این زبانه؟


نه مساله قدیمی بودن نیست مساله نزدیکی به کدهای cpu هست که اسمبلی را تا این زمان زنده نگه داشته و شما وقتی برنامه ای را به زبان اسمبلی مینویسید فرقی با زبانهای سطح بالا از لحاظ کد ندارد فقط با زبان اسمبلی بهتر میشه فهمید که کد به چه صورت از cpu استفاده میکند.

مثلا نمیشد بگن مثلا :
enteghal x,y
مثل خیلی از زبونای دیگه که در حقیقت خود کامپایلر اینارو می برد تو ثبات های مورد نظر

خب چرا ماکروهای آماده وجود دارند میتوانید خودتان تولید کنید و یا از سایرین بگیرید.

و سوال دومم اینه سخت احساس میکنم این مطلب رو که یادم باشه برای هر کاری ثبات رو با چه مقداری مقدار دهی کنم
ببینید دادن مقدار برای یک ثبات ارزش خاصی ندارد ولی وقتی بعد از مقدار دادن به ثبات وقفه یا یک تابعی فرا خوانده میشود مقدار موجود در ثبات باعث تغییر نوع کار وقفه ها میشود.
مثلا اگر وقفه 16h را در نظر بگیرید اگر قبل از اجرای int 16h شما ah را برابر صفر قرار بدید وقفه 16h متوجه میشود که باید کار شماره 0 را انجام دهد دلیلش این هست که حین اجرا مقدار ah را بررسی میکند و یا اگر مقدار ah را برابر 1 قرار بدید وقفه 16h باید کار شماره یک را انجام دهد. یعنی داخل وقفه ها شرط قرار داده شده که یک طرف این شرط بررسی ثباتی خاصی هست که قبل از وقفه باید با مقدار یا عددی خاص پر شود
و همین عمل برای سایر وقفه ها هم به همین شکل هست.

confesseur
جمعه 22 مرداد 1389, 22:15 عصر
ببخشید
من این ماکرو رو که می نویسم اصلا انگار این دستورات رو نمیشناسه
بدنه ماکرو اینه


add_b macro n1,n2,n3,n4
mov al,n1
ifb <n2>
add al,20
else
add al,n2
endif
ifb <n3>
add al,30
else
add al,n3
endif
ifb <n4>
add al,5
else
add al,n4
endif
endm

tdkhakpur
جمعه 22 مرداد 1389, 23:48 عصر
خب شما دستورات دیگه از نوع ماکرو استفاده کردید؟ اگر کد شما در رابطه با دستورالعملهای 8086 هست میتوان نظر داد ولی در این مورد لازم هست کل کدتان را ارسال کنید.

confesseur
شنبه 23 مرداد 1389, 12:02 عصر
; multi-segment executable file template.
add_b macro n1,n2,n3,n4
mov al,n1
ifb <n2>
add al,20
else
add al,n2
endif
ifb <n3>
add al,30
else
add al,n3
endif
ifb <n4>
add al,5
else
add al,n4
endif
endm
data segment
num1 db 1
num2 db 2
num3 db 3
num4 db 4

; add your data here!
pkey db "press any key...$"
ends

stack segment
dw 128 dup(0)
ends

code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax

add_b num1,,,num4

lea dx, pkey
mov ah, 9
int 21h ; output string at ds:dx

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

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

end start ; set entry point and stop the assembler.

tdkhakpur
شنبه 23 مرداد 1389, 14:46 عصر
مشکلی نداره فقط بعد از start: کد زیر را وارد کنید.


assume ss:stack, ds:data, cs:code

confesseur
شنبه 23 مرداد 1389, 14:58 عصر
ببینید موقق ران این خطاهارو میگیرم

tdkhakpur
شنبه 23 مرداد 1389, 17:06 عصر
کامپایلرتان تنظیم نیست یا کدها رو تشخیص نمیده
از کامپایلر خط فرمان برای کاربران اسمبلی (http://barnamenevis.org/forum/showthread.php?t=203406&highlight=%DA%A9%D8%A7%D9%85%D9%BE%D8%A7%DB%8C%D9% 84%D8%B1+%D8%A7%D8%B3%D9%85%D8%A8%D9%84%DB%8C) استفاده کنید.

confesseur
یک شنبه 24 مرداد 1389, 01:05 صبح
احساس شرمندگی میکنم
ولی متاسفانه تلاشم به جایی نمیرسه (درس رو بدون استاد دادن به ما چون تابستونه)
ظاهرا با این روش شما کامپایل شده ولی دلم میخاد توی emu8086 خیلی قشنگ مقدار فلگ هامو ببنیم
1-برنامه ای هست شبیه emu8086 شاید اون درست باشه(اصلا ایراد از emu 8086 هست؟)
2-من الان نمیتونم مقادیر فلگمو ببنیم اون debug r هم کمکی نمیکنه . میخام مثل emu8086 فلگامو راحت ببینم

tdkhakpur
یک شنبه 24 مرداد 1389, 13:35 عصر
-من الان نمیتونم مقادیر فلگمو ببنیم اون debug r هم کمکی نمیکنه . میخام مثل emu8086 فلگامو راحت ببینم

خب شما توابع اصلی خودتان را مانند print یا getstr و یا توابعی مشابه را با emu طراحی کنید و بعد از تست با کامپایلری که موجود هست استفاده کنید.

confesseur
یک شنبه 31 مرداد 1389, 12:46 عصر
ضمن سپاس فراوان
1-با توجه به اینکه محتوی ثبات ds ادرس شروع ناحیه ای از حافظس که دیتا ها در اونجا قرار میگیرن گفته برای بدست اوردن ادرس فیزیکی یا واقعی دیتا اینظور عمل کنید
محتوی ds ضربدر شانزده به اضافه آفست
خب چرا ضربدر شانزده ؟ یعنی همون ادرس شروع به اضافه آفست کافی نیست اصلا ادرس های حافظه چند رقمی هستن؟ تو چه مبنایی هستن؟
2- من وقتی عدد منفی دو رو به متغیر ایکس میدم عدد بصورت11111110 در میاد حالا وقتی این ایکس رو میدم به مثلا bp (تو برنامه ای ام یو) 254 توی متغیر ذخیره میشه یعنی msb رو نشونه منفی بودن در نظر نمیگیره. چرا ؟
3-من توی تقسیم با دستور div باقیماندم توی ax و حاصل توی Ax قرار نمیگیره چرا؟ همون مقدارایی که تو برنامه دادم میرن توی رجیسترا


x dw 2600
mov ax,00a2h
mov dx,0b1ch
div x

4-یه تمرین هست توی کتاب که گفته حاصل جمع ax bx cx dx رو بیابید خب سوال من اینه چرا add رو بکار نبرده ؟آخه مثلا تو خط اول فرض کنیم cf یک هم باشه اخه این یکه با کل اینا جمع میشه در صورتی که میدونیم این یکه باید در سمت چپ عدد قرار بگیره(ر حقیقت مثله محاسبات 32 بیتی)کتاب غلط گفته نه؟


adc ax,bx
adc dx,cx
adc ax,dx

5-گفته اگر محتوی al رو به word تبدیل کنید و نتیجه رو بزارید توی ax اگر msb al صفر باشه ah کلا صفر میشه و اگر msb al یک باشه ah کلا یک میشه
یعنی چی؟ چطوری تبدیل کنم؟

tdkhakpur
دوشنبه 01 شهریور 1389, 15:15 عصر
1-با توجه به اینکه محتوی ثبات ds ادرس شروع ناحیه ای از حافظس که دیتا ها در اونجا قرار میگیرن گفته برای بدست اوردن ادرس فیزیکی یا واقعی دیتا اینظور عمل کنید
محتوی ds ضربدر شانزده به اضافه آفست
خب چرا ضربدر شانزده ؟ یعنی همون ادرس شروع به اضافه آفست کافی نیست اصلا ادرس های حافظه چند رقمی هستن؟ تو چه مبنایی هستن؟

نحوه آدرس دهی برای حالتهای سیستم عامل متفاوته مثلا در حالت حقیقی مانند داس این آدرسها باید ضریبی از 16 بایت باشه این 16 بایت برای مشخصات بلوک یا پاراگراف رزرو شده به کار برده میشود و سیستم عامل از این طریق میداند که باید حافظه به چه نحو ویرایش و یا پاک شود.مثلا گر مقدار ds برابر 2 هست به این معنی هست که حافظه احتصاص داده شده برای ds منطقا از ادرس 16-16*2 در رم شروع میشود ولی در حالت استفاده نرم افزاری از آدرس 2*16شروع میشود با این حساب آفست به اضافه آدرس ds یا عملیات فوق ادرس حقیقی دیتای شما در ram هست.
ولی در حالت حفاضا شده آدرس دهی کمی متفاوت هست و هر آدرس باید صفحه بندی بشه و آدرس بر اساس این صفحات بدست می آد.(برای اطلاعات بیشتر میتواند مشخصات پردازنده 80286 یا 80386 که قادر به سویچ به مد حفاظت شده است را مطالعه کنید.)

2- من وقتی عدد منفی دو رو به متغیر ایکس میدم عدد بصورت11111110 در میاد حالا وقتی این ایکس رو میدم به مثلا bp (تو برنامه ای ام یو) 254 توی متغیر ذخیره میشه یعنی msb رو نشونه منفی بودن در نظر نمیگیره. چرا ؟
عدد منفی داخل رجیسترها معنی ندارد فقط این شمایید که با بررسی آخرین بیت میتوانید تشخیص بیدی عد منفی هست یا خیر.

3-من توی تقسیم با دستور div باقیماندم توی ax و حاصل توی Ax قرار نمیگیره چرا؟ همون مقدارایی که تو برنامه دادم میرن توی رجیسترا

برای div با عملوند حافظه آپ کد مشخصی وجود ندارد شما باید صراحتا با al و یا ax مشخص کنید که عملیات شما چند بایتی هست مثلا


mov ax, 10
mov bl, 2
div bl




4-یه تمرین هست توی کتاب که گفته حاصل جمع ax bx cx dx رو بیابید خب سوال من اینه چرا add رو بکار نبرده ؟آخه مثلا تو خط اول فرض کنیم cf یک هم باشه اخه این یکه با کل اینا جمع میشه در صورتی که میدونیم این یکه باید در سمت چپ عدد قرار بگیره(ر حقیقت مثله محاسبات 32 بیتی)کتاب غلط گفته نه؟


اون کدی که ارسال شده نتیجه اشتباه خواهد داد چون در اولین عملیات احتیاجی به cf نیست و اینجا ممکن هست که cf یک بوده باشد در نتیجه محاسبه اشتباه خواهد شد..


add ax,bx ; اینجا
adc dx,cx
adc ax,dx

ولی در مورد اینکه چرا cf باید در همه خطها باشد این هست که خب نتیجه جمع به عنوان بردست چه صفر باشد چه 1 باید به نتایج اضافه شوند و این کار باعث میشه که احتمال 0 و 1 در cf برطرف گردد.

5-گفته اگر محتوی al رو به word تبدیل کنید و نتیجه رو بزارید توی ax اگر msb al صفر باشه ah کلا صفر میشه و اگر msb al یک باشه ah کلا یک میشه یعنی چی؟ چطوری تبدیل کنم؟
متوجه منظورتان نشدم.

xman_1365_x
شنبه 06 شهریور 1389, 05:20 صبح
ضمن سپاس فراوان
1-با توجه به اینکه محتوی ثبات ds ادرس شروع ناحیه ای از حافظس که دیتا ها در اونجا قرار میگیرن گفته برای بدست اوردن ادرس فیزیکی یا واقعی دیتا اینظور عمل کنید
محتوی ds ضربدر شانزده به اضافه آفست
خب چرا ضربدر شانزده ؟ یعنی همون ادرس شروع به اضافه آفست کافی نیست اصلا ادرس های حافظه چند رقمی هستن؟ تو چه مبنایی هستن؟
================================================== =
دوست عزيزي كه در بالاي كامنت من جواب دادن جوابشان اشتباه هست چون سيستم عامل وابسته به پردازنده هست نه پردازنده وابسته به سيستم عامل
ببينيد ما دو نوع ساختار حافظه داريم 1- ساختار فيزيكي 2- ساختار منطقي
1- ساختار حافظه در پردازنده 80286 ، 20بيت مي باشد.( 2 به توان 20)
يعني يك با 20 تا صفر در جلوش يا fffff
2-ساختار منطقي: وقتي پردازنده ما 16 بيتي مي باشد(ffff) پس نمي تواند آدرس هاي حافظه رم كه 20 بيتي هستند را آدرس دهي كند براي حل اين مشكل
از روش: سگمنت * 16 + آفست= آدرس فيزيكي استفاده ميشه
xxxx:xxxx كه بخش راست آفست و بخش چپ سگمنت مي باشد.
اين ضرب در 16 براي اينه كه يك رقم 0 هگز به به عدد اضافه ميشه و با آفست جمع ميشه
مي شود ادرس فيزيكي و بعد با تقسيم عدد بر 16 تبديل به عدد در مبناي 16 مي شود و قابل فهم براي پردازنده 80286
آدرس هاي قابل فهم براي پردازنده 80286 20 رقم باينري هست و يا معادل با 5 رقم هگزادسيمال
از آنجايي كه محاسبه هگزا دسيمال براي ما انسان ها قابل فهم تر و ساده تر هست
بيشتر با اين مبنا كار ميكنيم اگرنه اجباري نيست چون در نهايت پردازنده مبناي 2 را مي فهمد و بس

================================================== =


2- من وقتی عدد منفی دو رو به متغیر ایکس میدم عدد بصورت11111110 در میاد حالا وقتی این ایکس رو میدم به مثلا bp (تو برنامه ای ام یو) 254 توی متغیر ذخیره میشه یعنی msb رو نشونه منفی بودن در نظر نمیگیره. چرا ؟
================================================== =
پردازنده 80286 اصلا تشخيص نمي دهد كه شما منفي داري يا مثبت يا مميز شناور و يا كاراكتر همه چيز صفر و يك مي باشد و با منطق هايي تعريف شده و الگوريتم ها مي توانيم اين كار ها را انجام دهيم اما موقعي كه msb يك يا صفر باشد فلگ sf صفر يا يك ميشه تا ما تشخيص بدهيم! و بتوانيم در محاسباتمان آنرا در نظر بگيريم.
================================================== =


3-من توی تقسیم با دستور div باقیماندم توی ax و حاصل توی Ax قرار نمیگیره چرا؟ همون مقدارایی که تو برنامه دادم میرن توی رجیسترا


x dw 2600
mov ax,00a2h
mov dx,0b1ch
div x


================================================== =
دوستمون در بالا كامنت بالاي من نوشتن آپ كد موجود نيست مگه ميشه نباشه؟
بريد مطالعه كنيد هست
در مورد div زياد وقت نداشتم بش فكر نكردم كدوم قسمت اين سرريز رخ داد اما در emu8086 تا اين بازه درست انجام ميدهد بالاتر بره سريز رخ مي دهد. و اجراي برنامه پايان مي پذيره.


org 100h
mov ax,0ffffh
mov dx,0affh
div x
ret
x dw 2600d
end

================================================== =

4-یه تمرین هست توی کتاب که گفته حاصل جمع ax bx cx dx رو بیابید خب سوال من اینه چرا add رو بکار نبرده ؟آخه مثلا تو خط اول فرض کنیم cf یک هم باشه اخه این یکه با کل اینا جمع میشه در صورتی که میدونیم این یکه باید در سمت چپ عدد قرار بگیره(ر حقیقت مثله محاسبات 32 بیتی)کتاب غلط گفته نه؟


adc ax,bx
adc dx,cx
adc ax,dx


================================================== =
كد شما كلا خوب نيست چون اگر شرايط بحراني را در نظر بگيري از بازه خارج ميشه و محاسبه اشتباه ميشه براي اين 4 ثبان به 20 بايت براي جمع نياز داريم چون متغيير 20 بيتي نداريم بايد 32 بيتي تعريف كنيم بعد آنها را جمع كنيم
اما اگر خوشبين نگاه كنيم خط اول add باشه باقيش موردي نداره چون هنگام اجراي برنامه فلگ ها دستكاري ميشه اگر فلگ كري در اون لحظه يك باشه جواب محاسبه اشتباه ميشه
================================================== =


5-گفته اگر محتوی al رو به word تبدیل کنید و نتیجه رو بزارید توی ax اگر msb al صفر باشه ah کلا صفر میشه و اگر msb al یک باشه ah کلا یک میشه
یعنی چی؟ چطوری تبدیل کنم؟
================================================== =
يعني وقتي al مثلا ff باشه بعد از تبديل ah ميشه ff
براي تبديل بايت به ورد از cbw استفاده ميشه و مقدار را در al قرار ميدهيم و تبديل ميشه در
ax قرار ميدهد.
براي تبديل ورد به دابل ورد از cbw استفاده ميشه مقدار را در ax و نتيجه در eax قرار ميگيرد.

موفق باشيد.:قلب:
================================================== =

confesseur
سه شنبه 09 شهریور 1389, 21:27 عصر
من شنبه امتحانمو بدم راحت میشید از دستم بچه ها (در نبود استاد نقش استاد رو بازی کردید برا من)
1-irpc رو یه مثال میزنید
2-گفته ds:dx اشاره به رشته ای می کند که شامل نام باشد . یعنی چی؟ رشته شامل نام یعنی چی؟ اصلا فرض کنید یه رشته هست با محتوی amin من چند بایت براش در نظر بگیرم؟چهارتا واسه کارکترا و یکی هم برای پایان . ایا به بایت دیگه ای نیاز هست؟
3-یعنی چی :


str db 40,40 dup (?)
4-


mov ax,datasg
mov ds,ax
mov es,ax

چرا دیتا سگمنتو میزارن توی es و اینکه نمشید این کارو با assume انجام داد مثلا گفت assume es:datasg اصلا مگه assume ds:datasg نمیاد دیتا رو با ثبات مرتبط کنه دیگه جرا میگیم mov ds,datasg
5-فلگ دی اف چه تاثیری داره تو کپی رشته ؟
6-من باید حتما رشته مقصدمو تو اکسترا سگمت تعریف کنم؟ اخه جواب نمیگیرم اصلا تفاوت رشته ای که توی اکسترا و دیتا تعریف شه چیه؟
7-lea si,es:here یعنی چی؟
8- mov byte ptr[di],20h یعنی چی؟کارکتر اسپیزو کجا میزاره

tdkhakpur
چهارشنبه 10 شهریور 1389, 14:28 عصر
دوست عزيزي كه در بالاي كامنت من جواب دادن جوابشان اشتباه هست چون سيستم عامل وابسته به پردازنده هست نه پردازنده وابسته به سيستم عامل

کی گفته پردازنده به سیستم عامل وابسته هست؟


ببينيد ما دو نوع ساختار حافظه داريم 1- ساختار فيزيكي 2- ساختار منطقي
1- ساختار حافظه در پردازنده 80286 ، 20بيت مي باشد.( 2 به توان 20)
يعني يك با 20 تا صفر در جلوش يا fffff

خب از اول 20 بیتی بود از وقتی که 8086 ساخته شد بیست بیت طول داشت.
در ضمن برای پردازدنده یا قابلیت سویچ به حالت حفاضت شده این آدرس 48 بیت طول داره نه 20 بیت.

2-ساختار منطقي: وقتي پردازنده ما 16 بيتي مي باشد(ffff) پس نمي تواند آدرس هاي حافظه رم كه 20 بيتي هستند را آدرس دهي كند براي حل اين مشكل
از روش: سگمنت * 16 + آفست= آدرس فيزيكي استفاده ميشه
xxxx:xxxx كه بخش راست آفست و بخش چپ سگمنت مي باشد.
اين ضرب در 16 براي اينه كه يك رقم 0 هگز به به عدد اضافه ميشه و با آفست جمع ميشه مي شود ادرس فيزيكي و بعد با تقسيم عدد بر 16 تبديل به عدد در مبناي 16 مي شود و قابل فهم براي پردازنده 80286

این قانون ریزپزدازنده هست که این کار رو بکنه حالا من ds رو برابر یک قرار میدم ادرس فیزیکی من کجاست؟


آدرس هاي قابل فهم براي پردازنده 80286 20 رقم باينري هست و يا معادل با 5 رقم هگزادسيمال

نه 48 رقم باینری هستنه 20!
برای 8088و 8086 به این شکلی هست که شما میگید.

tdkhakpur
چهارشنبه 10 شهریور 1389, 14:48 عصر
به بندهایی که متوجه میشود پاسخ داده شد.


2-گفته ds:dx اشاره به رشته ای می کند که شامل نام باشد . یعنی چی؟

یعنی شما تعریفی ازش داخل سگمنت داده تان کرده باشید و رسته ای که آدرس آن داخل dx هست در سگمنت ds قرار دارد.


رشته شامل نام یعنی چی؟

خب همان معنی بالاست یعنی رشته ای که بهش اسم داده اید تا دسترسی بهش داشته باشید.


اصلا فرض کنید یه رشته هست با محتوی amin من چند بایت براش در نظر بگیرم؟

بستگی به الگوریتم کارتان دارد میتوانید به تعداد حروف اندازه بدید ولی در حالت استاندارد یعنی وقفه های دیگر در پردازش این اسم دچار مشکل نشن باید یک بایت به اندازه حافظه برای نشان دادن انتهای رشته اضافه کنید.یعنی در مورد فوق 5 بایت- بایت اخر برای وقفه های داس باید با علامت $ پر بشه ولی در کامپایلرهای پیشرفته ای ماند پاسکال و سی این مقدار 0 هست یعنی علامت انتهای رشته 0 باید باشه.


چهارتا واسه کارکترا و یکی هم برای پایان . ایا به بایت دیگه ای نیاز هست؟

بله نیاز هست در بالا دلیلش توضیح داده شد.

3-یعنی چی :(str db 40,40 dup (?))
یعنی برای شما داخل سگمنت فضایی به طول 40 و باز 40 با محتوای دلخواه یا همانی که فعلا دارد را رزرو کند. که کلا میشه رزرو 80 بایت.



4-کد


mov ax,datasg
mov ds,ax
mov es,ax

چرا دیتا سگمنتو میزارن توی es و اینکه نمشید این کارو با assume انجام داد مثلا گفت assume es:datasg اصلا مگه assume ds:datasg نمیاد دیتا رو با ثبات مرتبط کنه دیگه جرا میگیم mov ds,datasg

نه اینگونه کارها cpu را تحت تاپیر قرار نمیده بلکه کامپایلر را متقاعد میکنه که چطوری داده ها را بچینه و آدرس را برای link آماده کنه.به همین دلیل باید به نحوی cpu را هم متوجه محل ادرس سگمنتها هم کرد.assume فقط برای ادرس دهی برای پردازش لینکر هست نه Cpu.

5-فلگ دی اف چه تاثیری داره تو کپی رشته ؟
خب این فلگ سمت حرکت برای آپ کدهای مخصوص رشته ها تاثیر داره و جهت حرکتشان را مشخص میکنه یعنی از چپ به راست و یا بالعکس.

6-من باید حتما رشته مقصدمو تو اکسترا سگمت تعریف کنم؟ اخه جواب نمیگیرم اصلا تفاوت رشته ای که توی اکسترا و دیتا تعریف شه چیه؟

نه میتوانید سگمنت ds را push کنید و داخل اون هم قرار بدید و بعد از استفاده باز با استفاده از pop سر جاش برگردونید.
ولی در مورد اینکه جواب نمیگیرید به وقفه یا پروسه ای دارد که شما رشته را بهش پاس میدید شاید این پروسه نیاز دارد شما رشته را داخل es ادرس دهی کنید.


7-lea si,es:here یعنی چی؟

یعنی آدرس hrer(از هر نوع باشه) را در si قرار بده , es به معنی این هست که سگمنت نگه دارنده hrer داخل es قرار دارد.

8- mov byte ptr[di],20h یعنی چی؟کارکتر اسپیزو کجا میزاره
در اینجا شما میگید عدد 20 در هگز (کاراکتر اسپیس)را در حافظه ای که ادرس آن در di هست قرار بده. و علامت [] یعنی داخل این حافظه قرار بده یعنی داخل عددی که در di هست و خودتان هم میدانید که این عدد ادرس حافظه هست.

xman_1365_x
شنبه 13 شهریور 1389, 02:56 صبح
کی گفته پردازنده به سیستم عامل وابسته هست؟
=======
من حرفتون رو بد متوجه شده بودم شرمنده
=======

در ضمن برای پردازدنده یا قابلیت سویچ به حالت حفاضت شده این آدرس 48 بیت طول داره نه 20 بیت.
======================
اين 48 بيت رو يك مثال ميزنيد؟ يك مثال خوب براي اين آدرس دهي!
http://en.wikipedia.org/wiki/Protected_mode
تا جايي كه من مي دونم براي 80286 24 بيت كه 16 مگابايت ميشه و در حالت واقعي هم
2 به توان 20 كه ميشه يك مگابايت و مستقيم هم 64 كيلوبايت
و براي 80386 هم32 بيت كه 4 گيگابايت ميشه
ضمنا از اونجايي كه اين دوستان مثال هاي كتاب پيام نور مي زنند و در اين كتاب اصلا حرفي از
مد هاي پردازنده نشده منم نخواستم اونهارو درگير مسائل ديگه كنم و فقط پرسش به سوال مربوطه بود.
======================



این قانون ریزپزدازنده هست که این کار رو بکنه حالا من ds رو برابر یک قرار میدم ادرس فیزیکی من کجاست؟


==========
من كه منظورتون رو نفهميدم از اين حرف
اما اين مثالي كه زدين جوابش ميشه 00010 و به اين خانه از حافظه اشاره ميكنه.
اين قانون هم نانوشته نبوده با همين الگوريتم در پردازنده به كار بردن مثل خيلي مسائل ديگه
تا برنامه نويش كمتر درگير جزئيات شه
==========

نه 48 رقم باینری هستنه 20!
برای 8088و 8086 به این شکلی هست که شما میگید.
============
من كه اين 48 رو متوجه نشدم شايد اشاره گر ها رو ميگين در حالت حفاظت شده
اما اين مدي كه من گفتم در تمامي پردازنده ها اجرايي هست بدليل "backward compatibale" بودن پردازنده هاي جديدتر
مثال بزنيد ما هم ياد بگيريم!
============


irpc رو یه مثال میزنید
==========
كجا ديدن اين irpc ؟ لينك يا صفحه كتابش رو بگين!
==========


اخه جواب نمیگیرم اصلا تفاوت رشته ای که توی اکسترا و دیتا تعریف شه چیه؟
و
lea si,es:here یعنی چی؟
============
كلا es براي كار با رشته ساختن مثل دستورات كار با رشته و تو برنامه كه طولاني شه شما يك سگمنت مخصوص براي كار با رشته داري و حداقل فايده اينه به جز كارايي!!! شما تفكيك سازي كردي
اينم مثال:


; multi-segment executable file template.
data segment stack 'data'
; add your data here!

ends
exterasg segment para stack 'extra'
txt1 db "Lea si,es:here$"
here db "LEA get your variable start address of ES=SEGMENT & here=OFFSET and put in SI$"
pkey db "Press any key...$"
ends
stack segment stack 'stack'
dw 128 dup(0)
ends
code segment stack 'code'
start:
; set segment registers:
mov ax, data
mov ds, ax
mov ax, exterasg
mov es, ax
; add your data here!

lea si,es:here
lea dx, txt1
mov ah, 9
int 21h

mov ah, 2
mov dl, 0dh
int 21h
mov dl, 0ah
int 21h
mov dl, 07h ;beep :D
int 21h

lea dx, here
mov ah, 9
int 21h


mov ah, 2
mov dl, 0dh
int 21h
mov dl, 0ah
int 21h
mov dl, 07h ;beep :D
int 21h

lea dx, pkey
mov ah, 9
int 21h ; output string at ds:dx

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

mov ax, 4c00h ; exit to operating system.
int 21h
ends
end start ; set entry point and stop the assembler.

============================

tdkhakpur
شنبه 13 شهریور 1389, 11:51 صبح
اين 48 بيت رو يك مثال ميزنيد؟ يك مثال خوب براي اين آدرس دهي!


مثال لازم نیست شما تفاوتهای بین دو پردازنده 8088 و 80286 را جستجو کنید متوجه خواهید شده که این پردازنده ثباتهایی مانند GDTR و IDTR داره که برای ارتقای آدرس به 48 بیت مورد استفاده قرار گرفته.
اگر قرار بود با اضافه شدن 4 بیت به 20 بیت اسم 286 را به پردازنده بدن خب میگفتن ورژن 2 پردازنده 8088.(یا همچین چیزی)
توضیحات پیچیده ای در مورد آدرس دهی فیزیکی داره که باید به دقت مطالعه شود با دو سه خط نمیشه توضیح داد.

xman_1365_x
یک شنبه 14 شهریور 1389, 14:25 عصر
مثال لازم نیست شما تفاوتهای بین دو پردازنده 8088 و 80286 را جستجو کنید متوجه خواهید شده که این پردازنده ثباتهایی مانند GDTR و IDTR داره که برای ارتقای آدرس به 48 بیت مورد استفاده قرار گرفته.
توضیحات پیچیده ای در مورد آدرس دهی فیزیکی داره که باید به دقت مطالعه شود با دو سه خط نمیشه توضیح داد.


انگار شما اين پردازنده رو با 386 اشتباه گرفتين! 286 اين ثباتها رو نداره gdtr ,idtr 32 بيتي هستند! ، براي همينه كه ميگم 48 بيت رو از كجا آوردين مثال بزنيد يا لينك بدين ما بريم بخونيم. 286 با اينا كار مي كنه gdt,idt,ldt,tr
آدرس دهي در مد protected در 80286 ، 32 بيتي هست 16 بيت سلكتور 16بيت آفست 24 بيت هم جايي كه سلكتور اشاره ميكنه با آفست جمع ميشه ميشه آدرس فيزيكي كه مي تونه آدرس دهي كنه 16 مگابايت هست،
ضمنا در اين مد پردازنده 286 مي تونه 1 گيگابايت حافظه مجازي هم دسترسي داشته باشه



اگر قرار بود با اضافه شدن 4 بیت به 20 بیت اسم 286 را به پردازنده بدن خب میگفتن ورژن 2 پردازنده 8088.(یا همچین چیزی)

80287 با كمي تغيير با 80286 هست همچنين تفاوت 80286 با 80188
8086 با 80286 هم خيلي فرق دارند مهمترين معيار تعداد ترانزيستور هاشه و كلاك بعد آدرس دهي بيشتر و امكاناتي كه بهش اضافه شد مثل مد حفاظت شده و...

tdkhakpur
یک شنبه 14 شهریور 1389, 19:22 عصر
لینک زیر را یه ذزه بیشتر بخوانید.
http://www.ece.unm.edu/~jimp/310/slides/micro_arch2.html