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

كيف اجمع الاعداد فوق 10 ؟

بدأه Ceren في 26 أبريل 2008 · 11 رد · 2,687 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

احتاج الى كود يجمع اعداد مافوق العشره ...

لانني لااعرف سوى جمع اعداد تحت العشره...

ارجو من لديه المعرفه التكرم ...وافادتي ..وفقكم الله..

#2

مثلها مثل غيرها ...

mov eax, 50
add eax, 600

او انك تقصد شئ اخر ؟؟

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#3

IN 16Bit ASM

استخدم INPUT_DECIMAL و OUTPUT_DECIMAL للأدخال والطباعه الأعداد الأكبر من 10 ، والجمع عادي ..

;************************************************************************ 
; An Assembly Language Program that will :
; read and print a decimal number using procedures INDEC and OUTDEC
;*************************************************************************

TITLE EX3.ASM : Read Decimal Number and print it in new Line

.MODEL	SMALL
.STACK	100H

.DATA
	PROMPT_1	DB		'Enter The Decimal Number  : $'
	MSG_1		DB		0DH,0AH,07H,'The Decimal is : $'

.CODE

	MAIN PROC

			MOV AX,@DATA
			MOV DS,AX

			MOV AH,9
			LEA	DX,PROMPT_1
			INT 21H


			CALL INPUT_DECIMAL

			PUSH AX

			MOV AH,9
			LEA	DX,MSG_1
			INT 21H

			POP AX

			CALL OUTPUT_DECIMAL

			MOV AH,4CH
			INT 21H

	MAIN ENDP



;*****************************************
;*****************************************
;************ INPUT_DECIMAL **************
;*****************************************
;*****************************************
; JOB	: input decimal number 
; INPUT  : none
; OUTPUT : AX

	INPUT_DECIMAL PROC
		@BEGIN:	
				XOR CX,CX
				XOR BX,BX

				MOV AH,1
				INT 21H

				CMP AL,0DH
				JE	@END_INPUT

				CMP AL,'-'
				JE	@MINUS

				CMP AL,'+'
				JE	@PLUS

				JMP @INPUT

		@MINUS:

				MOV CX,1

		@PLUS :
				INT 21H

		@INPUT:
				CMP AL,'0'
				JL	@ERROR

				CMP AL,'9'
				JG	@ERROR

				AND AX,000FH

				PUSH AX

				MOV AX,10
				MUL BX	
				POP BX
				ADD BX,AX

				MOV AH,1
				INT 21H
				CMP AL,0DH
				JE	@END_INPUT

				JMP @INPUT

		@END_INPUT:

				MOV AX,BX

				CMP CX,1
				JNE	@NEXT

				NEG	AX

			@NEXT:

				RET

		@ERROR:
			 MOV AH,2
			 MOV DL,0DH
			 INT 21H
			 MOV DL,0AH
			 INT 21H

			 JMP @BEGIN

	INPUT_DECIMAL ENDP



;*****************************************
;*****************************************
;************ OUTPUT_DECIMAL *************
;*****************************************
;*****************************************
; JOB	: output decimal number 
; INPUT  : AX
; OUTPUT : none

	OUTPUT_DECIMAL  PROC
					XOR CX,CX
					MOV BX,10D

					CMP AX,0
					JGE	@NEXT_

					PUSH AX

					MOV AH,2
					MOV DL,'-'
					INT 21H

					POP AX
					NEG AX
		@NEXT_:

		@OUTPUT:
					XOR DX,DX
					DIV BX
					PUSH DX
					INC CX
					CMP AX,0
					JNE	@OUTPUT

					MOV AH,2

		@TOP:
					POP DX
					OR	DL,30H
					INT 21H
					LOOP @TOP


					RET

	OUTPUT_DECIMAL ENDP

END MAIN

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#4

اللي فهمتوو لادخال عدد عشري استخدم سجل 32 بايت؟؟؟

ياريت شرح للبرنامج شااااكره لكم

#5

الادخال ممكن يتم بمختلف الطرق

ما البيئة المطلوب العمل بها أولاً ثم نتكلم عن الادخال والجمع.

Do as I say, not as I do

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

#6

جزا الله خير كل من حاول افادتي ولكن يااخ romansy حاولت تطبيق الكود لايجمع فقط يعرض ...كل مااريده ان استطيع توسيع هذا البرنامج وجعله يجمع اعداد مافوق العشره .......وشكرا

TITLE EX1.ASM : Sum of Two Number

.MODEL	SMALL
.STACK	100H

.DATA
	LF		EQU		0AH
	CR		EQU		0DH
	BEL		EQU		7H

	PROMPT_1	DB		CR,LF,BEL,'Enter Number (0-9) : $'

	MSG_1		DB		CR,LF,BEL,'The Sum of '
		NBR1		DB		?,' + '
		NBR2		DB		?,' = '
		SUM			DB		0,'$'

.CODE
	MAIN PROC

			MOV AX,@DATA; get Data Segment number
			MOV DS,AX	

			MOV AH,9
			LEA	DX,PROMPT_1
			INT 21H

			MOV AH,1
			INT 21H
			MOV NBR1,AL			

			MOV AH,9
			LEA	DX,PROMPT_1
			INT 21H

			MOV AH,1
			INT 21H
			MOV NBR2,AL

			SUB NBR1,30H
			SUB NBR2,30H
			MOV AH,NBR1
			ADD AH,NBR2
			MOV SUM,AH

			ADD NBR1,30H
			ADD NBR2,30H
			ADD SUM,30H

			MOV AH,9
			LEA	DX,MSG_1
			INT 21H

			MOV AH,4CH
			INT 21H
	MAIN ENDP
END MAIN

تم تعديل هذه المشاركة بواسطة Xacker في 27 أبريل 2008 في 21:40

#7

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

كنت اقوم بسرد فكرتي تقريبا بالتفصيل فحدث انقطاع بالتيار الكهربائي.. العوض بسلامتو الموضوع قبل النشر :P

سأحاول وضع الكود الذي بتصوري قريب قدر الامكان لما انت بحاجة اليه وعليك باكماله والتعديل عليه

ان احتجت لمساعدة فالأخوة لن يقصروا معك إن شاء الله.. أنا على سفر غداً بأي حال لا أعلم متى أتواجد في المنتدى مرة أخرى

.data

arrNum	db	10 dup (0)
nums	dw	100 dup (0)
sum	dw	0
final	db	10 dup (0)

.code
main	proc

lea	si,arrNum
xor	cx,cx
; هنا جميع الامور المتعلقة بادخال الرقم
; افحص الرقم هل هو عدد ام عملية رياضية
; ان كان رقما ...

mov	byte ptr [si],al
inc	si
inc	cx

; الى ان يتم ادخال اشارة عملية رياضية عندها سنقوم باعادة تشكيل الرقم لكي يتناسب مع عملية الجمع في المسجلات

xor	cx,cx
xor	ax,ax
lea	si,arrNum
@@:
mov	al,byte ptr [si]
inc	si
or	al,al
je	@F
sub	al,30h
lea	cx,word ptr [cx+cx*4]
lea	cx,word ptr [ax+cx*2]
jmp	@B
@@:
mov	ax,cx
; الى هنا قمت بتحويل الرقم من عشري الى hex والقيمة في AX
; قم بتخزين هذه القيمة في nums وانتقل الى الخانة التالية الفارغة

; بعد ان تم تحويل الرقم الأول قم بتصفير المصفوفة arrNum مرة اخرى
; قم باستقبال الرقم التالي ونفذ نفس الخطوات السابقة

; الانتهاء من الادخال يكون بادخال = أو النقر على زر Enter
; عندها ستقوم بالمرور على المصفوفة nums لتقوم بجمع محتوياتها
; عليك الانتباه الى الا يكون ناتج الجمع اكبر من 0FFFFh لان المسجل لن يكفيه حينها وستضطر الى استخدام طرق أخرى اعقد

; بعد الجمع سنقوم باعادة تحويل الرقم الى عشري من hex

mov	eax,sum; sum متغير يحمل قيمة الجمع
mov	cx,0CCCDh
lea	edi,final
mov	esi,edi
jmp	@next
@@:
mov	bx,ax
mul	cx
shr	dx,3
mov	ax,dx
lea	dx,word ptr [dx+dx*4]
add	dx,dx
sub	bx,dx
add	bl,30h
mov	byte ptr [di],bl
add	di,1
cmp	ax,0
ja	@B
@next:
mov	byte ptr [di],0
jmp	@done
@@:
sub	di,1
mov	al,byte ptr [si]
mov	ah,byte ptr [di]
mov	byte ptr [di],al
mov	byte ptr [si],ah
add	si,1
cmp	si,di
jb	@B
@done:

; المتغير final الآن يحمل الرقم بالتمثيل العشري تستطيع طباعته على الشاشة

الرجاء جداً جداً جداً التأني في العمل مع الكود, لم أقم بفحصه لكنه 75% صحيح وجداً قريب من الصحة.

الفكرة نفسها عند التحويل في 32بت, من خلال استخدام مكتبات مساعدة خاصة بـ masm32

الدوال هي atodw و dwtoa, يمكنك الاطلاع عليها للاستفادة في ملف masm32.inc في مجلد include

انتبه الى بعض الامور المتعلقة بمحدودية حجم المسجلات ومسألة نقر المستخدم على زر المسح ان تقوم بمراعاة هذا الامر في افراغ الرقم الأخير لذلك استخدم متغير بمسمى pos يشير دوما الى المكان الحالي في المصفوفة كي تقوم بالاعتماد عليه عند المسح وما الى هذا..

اتمنى ان اكون قد افدتك.

بالتوفيق

السلام عليكم

Do as I say, not as I do

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

#8

اخي Xacker شكرا على معلومتك القيمه . :D ..لكن لدي استفسار عن الكود حاولت فيه ناقص .....لانه مايتم لي عملية الجمع :S

بودي ان تفيدونني خصوصا وان هذه اللغه جديده علي وشكرا

تم تعديل هذه المشاركة بواسطة Ceren في 3 مايو 2008 في 17:01

#9

ارجو المساعده اذا حد عنده امكانيه عاجلا وشكرا

#10

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

تذكر ان الجمع يتم بالـ hexa لذلك عليه بتحويل العدد العشري المدخل الى hexa

الرقم المدخل سيتكون من اكثر من آحاد.. عشرات.. مئات

لذلك قمت بتعريف مصفوفة لتحميل منازل العدد فيها بالترتيب المدخل

من ثم بعد الانتهاء أعود اليها لاقوم بأخذ كل رقم فيها وحسب مكانه ضمن المصفوفة أحدد فيما اذا كان عشرات او مئات.. الآحاد مفروغ منها

لاقوم بتحويل هذا العدد من عشري الى ست عشري وهو ما احاول توضيحه في الاعلى ثم اقوم بجمع جميع هذه التحويلات للمنازل لكي احصل على العدد نفسه بصيغة hexa

لو كنت تعمل على win 32 bit لكان موضوع التحويل بسيطاً جداً من خلال مكتبة masm32.lib لكن استفدت من الفكرة فيها في عملية التحويل ضمن امكانيات win 16 bit

بعد الانتهاء وعندما تريد طباعة الرقم عليك بتحويله الى decimal لذلك ستقوم باتباع طريقة ثانية ايضا حاولت توضيحها اعلاه.

خلاصته, ما تطلبه غالبا لم يعطى لك في الجامعة لأنهم لو فعلوا بدون محاولة تقريب طريقة تحويل الاعداد بين انظمة العد في الاسمبلي لكانوا أغبى مدرسين في الأرض

ان كان هذا الامر من دراستك الخاصة فعليك بالتعب لأنك ستستفيد جداً في النهاية

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

لو احتجت مساعدة اطلبها لكن بعد ان تعجز بنفسك ولن يتردد احد بالمساعدة ان شاء الله

ملاحظة: مع الامثلة الموجودة مع Emu8086 وهو مجمع للأسمبلي يستخدم غالباً في التدريس اذكر يوجد مثال عن موضوع جمع الاعداد الكبيرة يمكنك الاطلاع عليه والاستفادة من التعليقات وتستطيع رؤية التنفيذ خطوة خطوة من خلال الـ debugger الخاص به

السلام عليكم

تم تعديل هذه المشاركة بواسطة Xacker في 6 مايو 2008 في 11:42 — السبب: اضافة ملاحظة

Do as I say, not as I do

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

#11

عندي سؤال :

لماذا كل هذا الجهد في جمع أعداد فوق 10 من خلال Assembly ؟

مثلا في VB :

print 1 + 1

فهل هناك سبب لذلك

أو وجه مرونة معين ؟

أم أن هذه طبيعة اللغة ؟

اقتباس
If A is success in life, then A equals x plus y plus z. Work is x; y is play; and z is keeping your mouth shut

Albert Einstein

مدخل إلى برمجة وتصميم الألعاب : كيف أبدأ ؟

#12

هل تعتقد أن هدفه هو انتاج برنامج لجمع الاعداد فوق العشرة في الاسمبلي؟

كما في كل لغة هناك بعض الامور التي على الشخص اتقانها قبل الاكمال

في الاسمبلي هناك بعض الامور التي على الشخص الالمام بها لانها ستواجهه في كل تطبيق تقريبا وكما ذكرت, لو كان التطبيق الذي يحاول التدرب عليه 32 bit لكان موضوع الجمع سهل جداً من خلال بعض الدوال الجاهزة في مكتبة masm32.lib

هو يتعلم, وليس ينتج ليطرح في السوق. ثم هل هناك مقارنة بين الاسمبلي والفيجوال بيسك؟ :rolleyes:

تم تعديل هذه المشاركة بواسطة Xacker في 7 مايو 2008 في 12:41

Do as I say, not as I do

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

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