السلام عليكم
احتاج الى كود يجمع اعداد مافوق العشره ...
لانني لااعرف سوى جمع اعداد تحت العشره...
ارجو من لديه المعرفه التكرم ...وافادتي ..وفقكم الله..
السلام عليكم
احتاج الى كود يجمع اعداد مافوق العشره ...
لانني لااعرف سوى جمع اعداد تحت العشره...
ارجو من لديه المعرفه التكرم ...وافادتي ..وفقكم الله..
مثلها مثل غيرها ...
mov eax, 50 add eax, 600
او انك تقصد شئ اخر ؟؟
mov eax, dword ptr ds:[0xffdf0308]
jmp dword ptr [eax+0xfc]
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
اللي فهمتوو لادخال عدد عشري استخدم سجل 32 بايت؟؟؟
ياريت شرح للبرنامج شااااكره لكم
الادخال ممكن يتم بمختلف الطرق
ما البيئة المطلوب العمل بها أولاً ثم نتكلم عن الادخال والجمع.
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
جزا الله خير كل من حاول افادتي ولكن يااخ 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
السلام عليكم ورحمة الله وبركاته
كنت اقوم بسرد فكرتي تقريبا بالتفصيل فحدث انقطاع بالتيار الكهربائي.. العوض بسلامتو الموضوع قبل النشر :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
اخي Xacker شكرا على معلومتك القيمه . :D ..لكن لدي استفسار عن الكود حاولت فيه ناقص .....لانه مايتم لي عملية الجمع :S
بودي ان تفيدونني خصوصا وان هذه اللغه جديده علي وشكرا
تم تعديل هذه المشاركة بواسطة Ceren في 3 مايو 2008 في 17:01
ارجو المساعده اذا حد عنده امكانيه عاجلا وشكرا
أنا كما ذكرت لم أجرب الكود بالأصل لكن قلت أنه قريب جداً من الصحة وواضح من التعليقات أنه غير كامل عليك بإكماله فقط تكلمت عن الخطوات التي يستصعبها دوماً من يبدأ بالاسمبلي بمثل هذه الامثلة
تذكر ان الجمع يتم بالـ 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
عندي سؤال :
لماذا كل هذا الجهد في جمع أعداد فوق 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
هل تعتقد أن هدفه هو انتاج برنامج لجمع الاعداد فوق العشرة في الاسمبلي؟
كما في كل لغة هناك بعض الامور التي على الشخص اتقانها قبل الاكمال
في الاسمبلي هناك بعض الامور التي على الشخص الالمام بها لانها ستواجهه في كل تطبيق تقريبا وكما ذكرت, لو كان التطبيق الذي يحاول التدرب عليه 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