واضح آرشیو وب فارسی:سایت ریسک: تفاوت یک بایتی و دو بایتی در اسمبلی scooter2005 22 فروردين 1388, 16:51با توجه به اینکه میگن al , ah یک بایتی هستند و ax , dx دو بایتی هستند از کجا باید فهمید سوال ما یک بایتی هست یا دوبایتی مثلا در 5*12 جواب شده است mov al,12 mov bl ,5 mul bl یا در (y=12-(c*d اگر مثلا مقدار دی باشد 6 و سی باشد 13 جواب شده mov c,13 mov d,6 sub ax,12 mul c mov y,ax در مجموع از کجا بفهمیم که چه وقت باید از کدوم استفاده کنیم یعنی یه بایتی یا دو the_king 23 فروردين 1388, 00:43با توجه به اینکه میگن al , ah یک بایتی هستند و ax , dx دو بایتی هستند از کجا باید فهمید سوال ما یک بایتی هست یا دوبایتی مثلا در 5*12 جواب شده است mov al,12 mov bl ,5 mul bl یا در (y=12-(c*d اگر مثلا مقدار دی باشد 6 و سی باشد 13 جواب شده mov c,13 mov d,6 sub ax,12 mul c mov y,ax در مجموع از کجا بفهمیم که چه وقت باید از کدوم استفاده کنیم یعنی یه بایتی یا دو سوال خیلی خوبی رو مطرح کردید. اگر در صورت سوال مشخص نشده که نتیجه بایستی دو بایتی باشد یا یک بایتی، عملیاتی که در محاسبات انجام می شود رو بررسی کنید : 1) در هر متغیر و رجیستر یک بایتی بزرگترین عددی که ذخیره می شود 255 است و کوچکترین عدد منفی که می تواند در یک بایت ذخیره شود 128- است. پس اگر در بخشی از محاسبات با عددی بزرگتر از 255 یا عددی کوچکتر از 128- مواجه شدید، بایستی از متغیر و رجیستر دو بایتی استفاده شود. وگرنه بخشی از بیت های با ارزش عدد از دست می رود و نتیجه محاسبه درست نخواهد بود. 2) ضرب و تقسیم کردن یک بایتی در زبان اسمبلی 8086 از دو بایتی اش ساده تر است. در ضرب و تقسیم دو بایتی همواره مقدار رجیستر dx هم درگیر است. به همین دلیل است که تا حد امکان محاسبات را تک بایتی انجام دهید، از این جهت که نگران مقدار قبلی و بعدی رجیستر dx که در ضرب و تقسیم دو بایتی حاصل می شود نیستید. scooter2005 28 فروردين 1388, 08:24الان مي تونيد بگيد اين موارد درست هست يا خير t=ax+bx+m+13 add ax,bx add ax,m add ax,13 mov t,ax a=b-c+d mov ah,b mov bh,c sub ah,bh add ah,d mov a,ah the_king 28 فروردين 1388, 13:47الان مي تونيد بگيد اين موارد درست هست يا خير t=ax+bx+m+13 add ax,bx add ax,m add ax,13 mov t,ax a=b-c+d mov ah,b mov bh,c sub ah,bh add ah,d mov a,ah بله درست است. scooter2005 28 فروردين 1388, 14:39این دوتا هم درست هست که ضرب هستن x=a*b-c*d mov al,a mul b mov bx,ax sub bx,c mul d mov x,bx y=a*(b-c) mov al,b mov ah,c mov cl,a sub al,ah mul a mov x,al the_king 28 فروردين 1388, 15:26این دوتا هم درست هست که ضرب هستن x=a*b-c*d mov al,a mul b mov bx,ax sub bx,c mul d mov x,bx نه اشتباه است، چون عملگر ضرب نسبت به جمع و تفریق ارجحیت دارد : x = (a*b) - (c*d) بایستی ابتدا c را در d ضرب کنید و سپس حاصل را از a * b کسر نمایید : mov al, c mul d mov bx, ax mov al, a mul b sub ax, bx mov x, ax و یا ابتدا a را در b ضرب نموده و پس از محاسبه c * d، نتیجه را از ضرب اولی کسر نمایید : mov al, a mul b mov bx, ax mov al, c mul d sub bx, ax mov x, bx y=a*(b-c) mov al,b mov ah,c mov cl,a sub al,ah mul a mov x,al تقریبا درست است، فقط دو نکته رعایت نشده : 1) مقدار دهی cl بی مورد بوده چون از cl استفاده نکردید. 2) بجای y مقدار نهایی را در x قرار دادید. به شیوه خلاصه تر می توانید بنویسید : mov al, b sub al, c mul a mov y, al البته چون در صورت سوالها مشخص نشده که x و y مقادیر 8 بیتی دارند یا 16 بیتی، در انتخاب شیوه 8 یا 16 بیتی آزاد هستیم. scooter2005 05 ارديبهشت 1388, 06:10منظور شما در جوابا از 8 بايتي و 16 بايتي همون 1 بايتي و دو بايتي هست يا نه فرق دارن با هم . استاد ما مثالها رو 1 بايتي و دوبايتي متمايز مي كنه از هم . ميشه يكبار خلاصه نحوه ضرب يك بايتي و دوبايتي رو توضيح بديد يا مثال . the_king 05 ارديبهشت 1388, 11:34منظور شما در جوابا از 8 بايتي و 16 بايتي همون 1 بايتي و دو بايتي هست يا نه فرق دارن با هم . استاد ما مثالها رو 1 بايتي و دوبايتي متمايز مي كنه از هم . ميشه يكبار خلاصه نحوه ضرب يك بايتي و دوبايتي رو توضيح بديد يا مثال . من گفتم 8 بایتی و 16 بایتی ؟ بایت نه، بیت، 8 بیتی و 16 بیتی، هر بایت 8 بیت است، پس 8 بیتی معادل همان 1 بایتی است و 16 بیتی معادل 2 بایتی. ضرب یک بایتی (8 بیتی) توسط دستور Mul بدین شکل انجام می شود که مقدار موجود در رجیستر AL در یک مقدار یک بایتی (8 بیتی) که بعد از فرمان Mul مشخص می گردد، ضرب شده و حاصل در AX قرار می گیرد : مثلا MUL BL مقدار AL را در BL ضرب کرده و حاصل را در AX قرار می دهد. مثلا MUL CH مقدار AL را در CH ضرب کرده و حاصل را در AX قرار می دهد. مثلا MUL AL مقدار AL را در AL ضرب کرده و حاصل را در AX قرار می دهد. ضرب دو بایتی (16 بیتی) بدین شکل انجام می شود که مقدار موجود در رجیستر AX در یک مقدار دو بایتی (16 بیتی) که بعد از فرمان Mul مشخص می گردد، ضرب شده و حاصل در ترکیب دو رجیستر AX و DX قرار می گیرد، بدین نحو که دو بایت کم ارزش در AX و 2 بایت با ارزش در DX قرار می گیرد. مثلا MUL BX مقدار AX را در BX ضرب کرده و حاصل را در DX:AX قرار می دهد. مثلا MUL CX مقدار AX را در CX ضرب کرده و حاصل را در DX:AX قرار می دهد. مثلا MUL AX مقدار AX را در AX ضرب کرده و حاصل را در DX:AX قرار می دهد. فرض کنیم که مقدار AL برابر 3 و مقدار BL برابر 4 باشد، پس از اجرای دستور MUL BL، مقدار AX برابر 12 خواهد بود. فرض کنیم که مقدار AX برابر 3 و مقدار BX برابر 4 باشد، پس از اجرای دستور MUL BX، مقدار AX برابر 12 و مقدار DX برابر 0 خواهد بود. scooter2005 22 خرداد 1388, 17:40میشه لطفا بگید این دو مورد هم صحیح نوشته شده اند یا نه : cx=(a/b)-12 mov 500,a mov 284,b mov ax,a mov dx,0 div b sub ax,12 mov cx,ax در واقع در دو خط آخر بالایی درسته یا باید بگیم ( با فرض بر اینکه آ دوبایتی هست و بی هم دو بایتی) : sub dx,12 mov cx,dxاین سوال هم t=c-(a/b) mov c,125 mov a,400 mob b,73 mov ax,a div b sub c,al mob bl,c mov t,bl با فرض بر اینکه تقسیم دو بایت بر یک بایت هست تو این سوال هم این درست هست یا دو خط آخر رو حذف کنیم و بگیم mov t,al the_king 22 خرداد 1388, 19:49میشه لطفا بگید این دو مورد هم صحیح نوشته شده اند یا نه : cx=(a/b)-12 mov 500,a mov 284,b mov ax,a mov dx,0 div b sub ax,12 mov cx,ax در واقع در دو خط آخر بالایی درسته یا باید بگیم ( با فرض بر اینکه آ دوبایتی هست و بی هم دو بایتی) : sub dx,12 mov cx,dx دو سطر زیر اشتباه هستند، شما نمی توانید مقدار یک خانه از حافظه را در یک عدد کپی کنید : mov 500,a mov 284,b احتمالا منظورتان برعکس است : MOV a, 500 MOV b, 284 بقیه کدی که نوشتید کاملا اصولی و صحیح است : mov ax,a mov dx,0 div b sub ax,12 mov cx,ax این سوال هم t=c-(a/b) mov c,125 mov a,400 mob b,73 mov ax,a div b sub c,al mob bl,c mov t,bl گویا شما a را دو بایتی و b و c و t را یک بایتی فرض کرده اید، که البته فرض غیر قابل قبولی نیست، صرفا از این بابت فرض تان اهمیت دارد که در نحوه نوشتن کد ها خیلی تاثیر گذار است. سه سطر انتهایی کدتان صحیح است، اما مقدار c را برای محاسبه نتیجه خراب می کنید : sub c,al mob bl,c mov t,bl بهتر بود بجای دستکاری مقدار c از یک رجیستر همانند bl استفاده می کردید : mov c,125 mov a,400 mov b,73 mov ax,a div b mov bl, c sub bl, al mov t, bl با فرض بر اینکه تقسیم دو بایت بر یک بایت هست تو این سوال هم این درست هست یا دو خط آخر رو حذف کنیم و بگیم mov t,al نه، چون شما در al صرفا حاصل تقسیم a / b را دارید، پس al معادل فرمول t نیست. بایستی مقدار al را از c کم کنید. یک راه دیگر برای محاسبه c - al استفاده از (c + (-al است، بدین ترتیب که مقدار al را NEG کرده (al-) و حاصل را با c جمع کنید، اینطوری نیاز به bl یا هیچ رجیستر کمکی دیگری نیست : mov c,125 mov a,400 mov b,73 mov ax,a div b neg al add al, c mov t, al
این صفحه را در گوگل محبوب کنید
[ارسال شده از: سایت ریسک]
[مشاهده در: www.ri3k.eu]
[تعداد بازديد از اين مطلب: 4785]