الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

حاصل قسمة عددين باستخدام الطرح؟؟

بدأه برمجة حاسب في 22 مايو 2009 · 7 رد · 2,345 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

هذا برنامج يحسب حاصل قسمة باستخدام عملية الطرح

v3/v7

لكن لدي مشكلة بالبرنامج انه مثلا اذا قسمت عددين مثل

12/7=1.7لاينفذ البرنامج

لكن اذا قسمت على 4/2=2 ينفذ البرنامج

ممكن احد يساعدني ويعرف المشكلة

MOV V7,EAX

MOV EAX,V3

PRIN:

SUB EAX,V7

INC F

CMP EAX,0

JNE PRIN

MOV EAX,F

CALL WRITEINT

تم تعديل هذه المشاركة بواسطة Xacker في 23 مايو 2009 في 00:49

#2

اولا القسمة عن طريق الطرح تتطلب ان تخزن ناتج القسمة و باقيها لذلك فان ناتج مثل 1.3 لل يوجد

ثانيا قم بوضع شرط قبل الطرح و لا تطرح مباشرة...

PRIN:
SUB EAX,V7
INC F
CMP EAX,0
JNE PRIN

لم اجرب كودك لاني في cyber لكني لاحظت ان الشرط JNE للقفز سيعطيك حلقة مفرغة لذلك فهو لا يعمل

العمل كثير و الوقت قليل أعاننا الله

seo zen SEO Enlightment amazon danbo

#3

مثلاً

	mov	eax,dividend
	mov	ebx,divider
@@:
	cmp	eax,0
	je	noRemainder
	cmp	eax,0
	jl	@remainder
	sub	eax,ebx
	inc	result
	jmp	@B
@remainder:
	dec	result
	add	eax,ebx
	mov	remainder,eax
noRemainder:
;....

ولو كنت تستخدم HLA لكان أصبح الموضوع أوضح بكثير خصوصاً في المقارنة مع الأعداد السالبة من خلال الشكل

if ((type int32 eax) > 0)

لكني لا أحبها كثيراً ربما لأنها تصبح أقرب إلى H-L language منها إلى الأسمبلي اللذيذة :rolleyes:

تم تعديل هذه المشاركة بواسطة Xacker في 23 مايو 2009 في 04:14

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#4

السلام عليكم

اقتباس
mov	eax,dividend
	mov	ebx,divider
@@:; هل المفترض تكون هنا @B
	cmp	eax,0
	je	noRemainder
	cmp	eax,0
	jl	@remainder
	sub	eax,ebx
	inc	result
	jmp	@B
@remainder:
	dec	result
	add	eax,ebx
	mov	remainder,eax
noRemainder:
;....

ماهو مفهوم هذه الجمله هل اذا ادخلت عدد سالب المقصود بها

اقتباس
cmp	eax,0
	jl	@remainder

ولماذا اضيف add eax,ebx

اقتباس
@remainder:
	dec	result
	add	eax,ebx
	mov	remainder,eax

وشكرا

اقتباس
لاحظت ان الشرط JNE للقفز سيعطيك حلقة مفرغة لذلك فهو لا يعمل

مالمقصود بذلك ممكن توضيح اكثر وشكرا

#5

1. نعم @B مرتبطة بـ @@ أعتقد أنها ماكرو في MASM وربما لا تكون المهم MASM32 يقبلها لكن MASM16 لا أعتقد لذلك أتفادى كتابتها للأعضاء في تطبيقات MASM16.

مثلا

@@: ; <<< هذه لا يمكن الوصول إليها بعد الآن باستخدام @B لأنه يوجد الكثير من اللافتات الأخرى التي تليها

; <<< لكن يمكن الوصول إليها من الأعلى بشرط أن تكون أول لافتة تلي @F حصراً

mov eax,5

@@:

test eax,eax

jnz @F

dec eax

jmp @B

@@:

اقتباس
ماهو مفهوم هذه الجمله هل اذا ادخلت عدد سالب المقصود بها

cmp	eax,0
	jl	@remainder

لا المقصود التحقق إن كان العدد dividend يقبل القسمة دون باقي على المقسوم عليه divider حينها ستكون قيمة EAX بعد طرح المقسوم عليه منه أصغر من الصفر هذا يعني أنه يوجد باقي للقسمة ويجب إيجاده.

اقتباس
ولماذا اضيف add eax,ebx

لأن قيمة EAX ستكون سالبة بعد طرح المقسوم عليه منه لذلك نضيف المقسوم عليه مرة أخرى فتكون EAX = remainder ونصحح result بإضافة 1 حتى نحصل على الجزء الصحيح النظامي.

جرب الكود السابق في برنامج، استخدم 10 مقسوماً على 5 في البداية ثم استخدم 10 على 3 وضعه تحت debugger وانظر كيف يتم التنفيذ.

الـ debugger موجود مع النظام هو debug.exe تستطيع طلبه من خلال command line.

debug yourFile.exe

ثم استخدم الأمر p لتنفيذ الأسطر الواحد تلو الآخر، ربما تحتاج لاستخدام الأمر g أيضاً عند القفزات حتى تبقى داخل الحلقة حتى انتهائها ولا يتم إخراجك والتنفيذ فوراً (لكي تفهم سير العملية)

لمزيد من المعلومات عن هذه الأوامر أدخل الأمر

- ?

(فقط إشارة الاستفهام)

أطلت الحديث، اقرأ مشاركتي جيداً وحاول تطبيق ما ذكرته لك حول debug.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#6

وبخصوص هذا السؤال

اقتباس
لاحظت ان الشرط JNE للقفز سيعطيك حلقة مفرغة لذلك فهو لا يعمل

بالإذن من fkugd2003، ما قصده هو أنه لو وجد باقي فهذا الشرط يتحقق فقط لو كانت قيمة EAX مساوية للصفر لكن بوجود الباقي ستنتقل قيمة EAX من قيمة موجبة مثلاً 2 إلى سالبة مثلاً -1 لو كان العدد 5 والمقسوم عليه 3 دون المرور بالقيمة 0 بالتالي الحلقة لا تنتهي.

ولا تنسى أنه يوجد اختلاف بين التحقق من الأعداد المؤشرة signed وغير المؤشرة unsigned.. استخدم التعليمات (JL و JG) للمؤشرة (طبعاً ومشتقاتها JLE...) والتعليمات (JB, JA) للغير مؤشرة (ومشتقاتها JAE...).

تذكر أيضاً أن قيمة -1 يتم تمثيلها في المسجل EAX بالشكل FFFFFFFE وهي قيمة تعتبر أكبر من 0 لو كنت تتعامل معها على أنها غير مؤشرة بالتالي الحلقة لديك ستعود لتطرح 3 من الرقم وهكذا .. ربما تصل يوماً ما إلى الصفر وتنتهي وربما لا تصل. :D

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#7

مشكورين جزاكم الله الف خير صراحه استفد كثير في ميزان حسناتكم باذن الله

لكن بالنسبة للماكرو ليس لدي فكره عنه ايضا بالنسبة للdebug فانا استخدم cmd

لكن لدي سؤال اخير وعذرا على الازعاج انا محتارة المضورب انا فهمته اذا ادخلت موجب ينفذ لكن اذا ادخلت سالب يوقف ولاينفذ

هل لديكم فكرة عن ذلك وشكرا :huh: :)

#8

لا عليك من الماكرو حالياً.. المهم بخصوص فكرة القفز واستخدام @@ كـ label تكوني فهمتي كيف يمكنك الاستفادة منها عند الضرورة.

اقتباس
بالنسبة للdebug فانا استخدم cmd

هذه أنا لم أفهمها

اقتباس
لكن لدي سؤال اخير وعذرا على الازعاج انا محتارة المضورب انا فهمته اذا ادخلت موجب ينفذ لكن اذا ادخلت سالب يوقف ولاينفذ

إن كنت تقصدين الموضوع الآخر فيفضل كتابة استفسارك فيه حتى تكون الأفكار مرتبطة سوية للطلاب الباحثين لاحقاً، ولا تنسي وضع الكود الذي تستخدميه.

تم تعديل هذه المشاركة بواسطة Xacker في 24 مايو 2009 في 01:20

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

مواضيع مشابهة