تفاوت یک بایتی و دو بایتی در اسمبلی

scooter2005

Member
با توجه به اینکه میگن
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

مدیرکل انجمن
با توجه به اینکه میگن
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

Member
الان مي تونيد بگيد اين موارد درست هست يا خير

کد:
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

Member
این دوتا هم درست هست که ضرب هستن



کد:
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

مدیرکل انجمن
این دوتا هم درست هست که ضرب هستن
کد:
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

Member
منظور شما در جوابا از 8 بايتي و 16 بايتي همون 1 بايتي و دو بايتي هست يا نه فرق دارن با هم . استاد ما مثالها رو 1 بايتي و دوبايتي متمايز مي كنه از هم . ميشه يكبار خلاصه نحوه ضرب يك بايتي و دوبايتي رو توضيح بديد يا مثال .
 

the_king

مدیرکل انجمن
منظور شما در جوابا از 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

Member
میشه لطفا بگید این دو مورد هم صحیح نوشته شده اند یا نه :
کد:
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

مدیرکل انجمن
میشه لطفا بگید این دو مورد هم صحیح نوشته شده اند یا نه :
کد:
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
[B]mov bl, c[/B]
[B]sub bl, al[/B]
[B]mov t, bl[/B]

با فرض بر اینکه تقسیم دو بایت بر یک بایت هست
تو این سوال هم این درست هست یا دو خط آخر رو حذف کنیم و بگیم
کد:
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
[B]neg al[/B]
[B]add al, c[/B]
[B]mov t, al[/B]
 

جدیدترین ارسال ها

بالا