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

ارجو التصحيح

مغلق
بدأه محمد الطنه في 21 مايو 2004 · 3 رد · 576 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع
.MODEL TINY

.STACK

.CODE

.STARTUP

MOV AH,1

INT 21H

MOV BL,AL

MOV AH,1

INT 21H

ADD AL,BL

MOV bl,AL

CALL D

MOV AH,4CH

INT 21H

;********************************

D PROC

PUSH AX

PUSH BX

PUSH CX

and bl,0fH

ADD bx,30H

MOV DL,AL

MOV AH,2

INT 21H

SHR AL,4

ADD AL,30H

MOV DL,AL

MOV AH,2

INT 21H

POP CX

POP BX

POP AX

RET

D ENDP

.EXIT

END

]al program 3ayzo yagma3 rakman bass yakono 6+5=11 3ayez yatla3 keda mesh 3ref azabato

365159135_b0fcd2be76_o.jpg

365163463_a76592857a.jpg
#2

السلام عليكم

اخي انا سوف اقدم لك اقتراح لحل المشكلة. وهو كما يلي:

حسب ما كتبته انت فان النتيجة يمكن ان تتكون من خانتين مثل 5+6=11 الحل المقترح هو ما يلي

MOV AH,1

INT 21H

AND AL,0FH

MOV BL,AL

MOV AH,1

INT 21H

AND AL,0FH

ADD BL,AL

MOV AX,0

MOV AL,BL

MOV BL,0AH

DIV BL

ADD AX,3030H

MOV DX,AX

MOV AH,2

INT 21H

MOV DL,DH

MOV AH,2

INT 21H

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

ارجو ان يساعدك هذا الاقتراح

#3
  ARGO AL TAWDE7 WZA SAM7TMO
365159135_b0fcd2be76_o.jpg

365163463_a76592857a.jpg
#4

السلام عليكم

اولا ارجو منك الكتابة باللغة العربية وليس بالرموز او باللغة الانجليزية ولكن ليس بالاختصارات

ثانيا: اي توضيح تقصد.

فمقطع البرنامج السابق.

يستقبل في البداية العدد الاول من لوحة المفاتيح بمساعدة المقاطعة

mov ah,1

int 21h

بعد هذه العملية يتم تخزين الكود اسكي للعدد المدخل الى المسجل al ويجب تحويله الى الشكل العشري وذلك بمساعدة الامر sub al,30H أو الامر الذي سجلته لك في المقطع السابق وهو

and al,0fh

ثم تم وضع القيمة في المسجل bl لانه سوف نستعمل المسجل al مرة ثانية

MOV BL,AL

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

MOV AH,1

INT 21H

AND AL,0FH

بعد ذلك تم جمع العددين

ADD BL,AL

الان نريد ان نقسم العدد على 10 للحصول على منازل العدد كل منزلة على انفراد. العدد الاكبر الذي يمكن ان يظهر هو 9+9=18 اذا يكفي ان نقسم الجواب على عشرة للحصول على كل منزلة على انفراد. ولكن في الاسمبلي لا يمكن ان نقسم al لوحده فان البرنامج سوف يأخذ ax باكمله اذا يجب ان نضع صفر في المسجل ah ونضع في المسجل al نتيجة الجمع ثم نقسم على 10

MOV AX,0

MOV AL,BL

MOV BL,0AH

DIV BL

الان الناتج الصحيح موجود في المسجل al والباقي الصحيح في المسجل ah وحتى نستطيع الطباعة يجب تحويل كل قيمة من القيم الى الرمز الذي يقابلها في لائحة اسكي

وذلك عن طريق اضافة 30 في الميزان السادس عشر للقيمة

ADD AX,3030H

الان نضع النتيجة والباقي الصحيح في المسجل dx . لانه عند الطباعة يجب ان نضع الرمز المراد طباعته في المسجل dl ونضع القيمة 2 في المسجل ah ثم نسجل int 21h

بعد الامر التالي تكون منزلة العشرات في المسجل dl ومنزلة الاحاد في المسجل dh

MOV DX,AX

هنا طباعة منزلة العشرات

MOV AH,2

INT 21H

هنا طباعة منزلة الاحاد

MOV DL,DH

MOV AH,2

INT 21H

والسلام

تم تعديل هذه المشاركة بواسطة afeef في 21 مايو 2004 في 07:16

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

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