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

برنامج aأس b

مغلق
بدأه houssemsoft في 19 أبريل 2006 · 10 رد · 1,539 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

bism.gif

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

إخواني الأعزاء قمت بكتابة برنامج بلغة الأسمبلى يحسب القيمة a أس b بحث a مكتوبة ب4 بت (من 0إل 15)و b مكتوبة ب 2 بت

وقمت بأخذ بعين الإعتبار a=0 ; b=0 وهي نتيجة غير معرفة لكن الأستاذ لم يوافقني في هذا ولم يقتنع (ممكن أحد يبرهن على أن 0 أس 0غير معرف) .

أرجوا من الإخوة الأكارم أن ينظرو مامدى صحة هذا البرنامج وأجر لجميه على الله

تقبلوا مني فائق الإحترام والتقدير ;) البرنامج هو كالتالى

mov al,15 ; تأخذ القيم من 0 إلى 15 
mov bl ,3; تأخذ القيم من 0 إلى 3
cmp al ,15 
ja fin
cmp bl ,3
ja fin
cmp al ,0 
je eq1
cmp bl,0
je eq2
cmp al ,1
je eq2
cmp bl ,1
je eq4
cmp bl ,2
je eq5
mov cx ,al
mul al
mul cl
mov dx ,ax
hlt
eq1: cmp bl,0
      je fin
      mov dx,0
      jmp fin
fin:hlt
eq2: mov dx,1 
      jmp fin
eq4: mov dx,al
      jmp fin
eq5: mul al
      mov dx,al
      jmp fin

تم تعديل هذه المشاركة بواسطة Xacker في 20 أبريل 2006 في 00:03

ليس عيبا أن نرى أخطائنا ..............................عيبنا الأكبر أن نبقى نعاب

#2

هذا تصويب المثال لديك

power.rar

Do as I say, not as I do

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

#3

bism.gif

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

بارك الله فيك أخي الفاضل و أستاذنا الكريم Xacker على هذا التوضيح وشكرا على البرنامج الواضح ;)

ملاحظة لكن البرنامج عندما أدخلت له قيمة 0 أس 0 يعطي نتيجة 0 أي يجب وضع مقارنة ل a بالنسبة ل 0

أرجوا التأكد من صحته ولك مني جزيل الشكر وتقبل مني فائق الإحترام و التقدير

new_power.rar

ليس عيبا أن نرى أخطائنا ..............................عيبنا الأكبر أن نبقى نعاب

#4

أخي الفاضل Xacker ألا تلاحظ أنه عندما يصبح bl=0 و al=5 مثلا أو أي عدد غير 0 و 1 cl يأخذ قيمة bl ثم يصبح ff ثم bl يأخذ قيمة 5 أي سيضرب al في 5 ff مرة ؟؟؟

ليس عيبا أن نرى أخطائنا ..............................عيبنا الأكبر أن نبقى نعاب

#5

بالنسبة لمسالة التحقق من 0 اس 0 طبعا تحتاج الى اضافة تحقق كي يتم وضع الناتج 1 لاننا هنا نقوم باستخدام الضرب لاجراء عملية الرفع للقوة.

بخصوص المسالة الثانية,

.model	tiny
.code
	org	100h
start:
mov	al, 5; test
mov	bl, 0; test
cmp	al, 15
ja	fin
cmp	bl, 3
ja	fin
cmp	bl, 0
je	equ0
cmp	bl, 1
je	equ1
cmp	bl, 2
je	equ2
equ3:
	call	power
	jmp	print
equ0:
; undefined
	jmp	print
equ1:
	call	power
	jmp	print
equ2:
	call	power
print:
; convert into printable character
; and print
fin:
	mov	ax, 4c00h
	int	21h

power	proc	near
	mov	cl, bl
	dec	cl
	mov	bl, al
again:
	mul	bl
	loop	again
; al = al^bl
	ret
power	endp
end	start

تم تعديل هذه المشاركة بواسطة Xacker في 20 أبريل 2006 في 22:04

Do as I say, not as I do

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

#6

bism.gif

السلام عليكم أستاذي Xacker أولا أستسمحك عذرا لأخذي من وقتك الثمين جعله الله في ميزان حسناتك

ثانيا البرنامج الثاني كذلك لم أفهمه فهو لا يقوم بحساب القيمة 5 أس 0 التي تساوي 1وهي معرفة مع العلم أن البرنامج الأول مكتوب بلغة الأسمبلى للمعالج 8086

ثالثا قد قام الأستاذ عماد حمدى احمد بتوضيح حول قيمة 0 أس 0 بأنها غير معرفة و هذا ما نعتمده

الرابط /index.ph...=0entry477560

هل يكون حسب ظنك البرنامج الأول الذي كتبته صحيح ؟؟؟

ومعذرة مرة أخرى على الإطالة وفقك الله لما يحبه ويرضاه

و الله في عون العبد مادام العبد في عون أخيه

ليس عيبا أن نرى أخطائنا ..............................عيبنا الأكبر أن نبقى نعاب

#7

يا اخي هل تريدني ان انهي البرنامج لك؟

كل ما في الامر ما يلي:

.model tiny
.code
org 100h
start:
mov al, 5; test
mov bl, 0; test
cmp al, 15
ja fin
cmp bl, 3
ja fin
cmp bl, 0
je equ0
cmp bl, 1
je equ1
cmp bl, 2
je equ2
equ3:
call power
jmp print
equ0:
cmp al, 0        ; هل al = 0, بالتالي: 0^0
je undefined ; اذن اظهر رسالة انه غير معرف
mov al, 1        ; والا ضع مثلا القيمة 1 في al تحضيرا للطباعة
jmp print
equ1:
call power
jmp print
equ2:
call power
print:
; convert into printable character
; and print
fin:
mov ax, 4c00h
int 21h

power proc near
mov cl, bl
dec cl
mov bl, al
again:
mul bl
loop again
; al = al^bl
ret
power endp
end start

هل هذا الامر غير مفهوم!

Do as I say, not as I do

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

#8

bism.gif

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

أولا أستاذي الفاضل Xacker أنا لم أطلب منك إنهاء البرنامج لأني قمت بإنهائه طلبي هو مراجعته أن كان صحيح لأن أستاذي لم يوافقني في الرأي وقال إنه ليس برنامج ؟؟؟ لماذا ؟؟ قال هكذا

ثانيا الأمر مفهوم لكن أظن أن هناك بعض النقاط في البرنامج هي كالتالى

أولا لا داعي لإنقاص cl لأن التعليمة loop تقوم بهذا الأمر

ثانيا لو وضعنا السجل bl =1 و al يختلف عن 0 و 1 مثلا 2 النتيجة تكون 2 حسب البرنامج bl يأخذ قيمة al وتقوم التعليمة mul بضرب al * bl وتساوي في هذه الحالة 4 وبما أنه قيمة cl =0 بعد تنفيذ العملية تقوم loop بإنقص cl الناتج ffff و يكرر الضرب ffff مرة . :(

المهم أخي Xacker بارك الله فيك على مجهودك وعذرا مرة أخرى .

لدس إستفسار حول البرمجة بالأسمبلى : هل يجب على المبرمج عندما يبرمج في اللحظة الأولى أن يضع جميع الإحتمالات الممكنة و أن يتفطن لكل تفصيل ؟؟؟ أم يضع البرنامج دون تفصيل ثم يقوم بتحديثه ؟؟؟ .

أسأل الله لكم التوفيق و النجاح و أرجوا أن أكون عند حسن ظنك أخي أستاذي Xacker ;)

ليس عيبا أن نرى أخطائنا ..............................عيبنا الأكبر أن نبقى نعاب

#9
power proc near
mov cl, bl
dec cl
mov bl, al
again:
mul bl
loop again
; al = al^bl
ret
power endp

5^3 = 5*5*5.

al = 5

bl = 3

...

cl = bl = 3

dec cl > cl = 2

bl = al = 5

mul bl > al = al * bl * bl

يعني انقاص cl تم فقط لكي لا يتم التكرار 3 مرات لانك وضعت قيمة العدد المراد رفعه للقوة بالاصل في al ولو لم يتم الانقاص لتم رفعه (او بالاحرى ضربه بنفسه 4 مرات وليس) اي رفع لقيمة اكبر بواحد ولا علاقة له بالـ loop.

المشكلة ليست في انقاص cl فهذا ضروري, لكن يبدو ان loop لا تقوص بالانقاص ثم المقارنة ليتم النقل او لا بل تقوم بالنقل بعدها الانقاص.. المشكلة تحل بالغاء استعمال loop واستبدالها بـ cmp cl, 0 / je exit / jmp again .. او ادخال cmp ضمن الحلقة لكن هذا يزيد تعليمات فقط.

power proc near
mov     cl, bl
mov     bl, al
again:
dec cl
cmp	cl, 0
je	exit
mul bl
jmp	again
exit:
ret
power endp

اما بخصوص سؤالك الاخير فهذا الامر يجب تطبيقه في كل لغة برمجة, قم بكتابة برنامجك كما تتخيله مباشرة, ثم باشر تنقيحه وسد الثغرات, لو بدات بالبحث عن الثغرات في البداية لنسيت انك تقوم بكتابة برنامج وستبقى في دوامة ايجاد الاخطاء قبل البدء. اعتقد ان هذا الامر تعلمه جيدا لو يكن سؤال.

Do as I say, not as I do

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

#10

bsmlah.gif

أخي Xacker لا داعي لكتابة cmp cl لأن التعليمة jz تكفي

لكن يبقى نفس المشكل بالنسبة ل 5 أس 0 تابع معي

1- 5 =cl =0 ;al =bl

2- cl = cl -1

3- al = al * bl = 19 h

أنا فهمتك يا أستاذ ماذا تريد أن تفعل *-) تريد عمل proc تقوم بعمل كل شيء أي كل الإحتمالات وهذا تفكير رائع ليس كما قمت أنا بكتابة و تفصيل كل شيء على حدا مثلا أي شيء أس 0 هو 1

cmp bl,0

je eq2 .

. .

.

.

eq2: mov dx,1

jmp fin

إلى آخره قلى يا أستاذ ;) ليس هكذا يكون التفكير و إيجاد الحل ؟؟؟؟

المهم أود السؤال عن البرمجة ب 32 بت هل تختلف كثيرا عن 16 بت وهل هل سهلة للبرمجة

تقبل مني فائق الإحترام والتقدير ووفقك الله

ليس عيبا أن نرى أخطائنا ..............................عيبنا الأكبر أن نبقى نعاب

#11

اعمل بالاصول.. اختصار تعليمة لن يوفر اي وقت باي حال :)

اما بخصوص سؤالك الاخر.. ما زلت لا ادري هل هو سؤال ام جواب على السؤال نفسه! باي حال, ان امكنك اختصار العمليات في وظيفة اذا يفضل انشاء الوظيفة لانها تصبح عامة وبامكانك طلبها متى اردت ذلك.. اما تكرارها فهذا يخلق تعقيد لو وجدت مشكلة وزيادة في الحجم والتعليمات الضرورية..

اما بخصوص البرمجة بلغة 32بت, تختلف في الطريقة التي ستقوم فيها بكتابة التطبيق.. راجع المقالات التي كتبتها عن هذا الموضوع وقارنها مع تطبيقات 16بت.. السهولة فيها تكمن في وجود API جاهزة كدوال لتنفيذ ما تريد تنفيذه مثل فتح ملف, تشغيل صوت, ارسال رسالة, انشاء نافذة.. كل ما تحتاجه هو بعض القيم الابتدائية. ايضا لا تنسى امكانية التعامل مع مسجلات اطول وهذا سيسهل العمل بدون شك اكثر من التعامل مع 2بايت فقط!

Do as I say, not as I do

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

هذا الموضوع مغلق.

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