• 0
محمد الطنه

ارجو التصحيح

سؤال

             


          .MODEL SMALL
.STACK
.DATA
X DB 1,2,3,4,5,6,7,8
SUM DB 0
.CODE
.STARTUP
MOV SI,0
MOV CX,8
AA:
MOV A,[X]

ADD SUM,AX
ADD SI,2
LOOP AA
MOV AH,2
MOV DL,SUM
INT 21H
.EXIT
END

هو برنامج يربد جمع 8 ارقام و الوسط الحسابي و ارجو شرح كيف اظهر الناتج بوسطة int 21h و لكن اكثر من رقم مثال 8+10=18 كيف اظهر الرقن 18 بوسطة int 21 h

وشكرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

12 إجابة على هذا السؤال .

  • 0

ارجو المساعده

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

البرنامج فيه خطئين وهما:

1. add SI,2
2. mov A,[x]

الحل

TITLE	IntArray 
.MODEL  Large
.STACK  200h
.DATA
mess db 'The total is ','$'
result  dw  ?
IntArry dw 10, 34, 76, 25, 14, 9, 3, 22
IntAlen dw ($ - IntArry) / 2
buff  db  6
dup( 20h )  db '$'

.CODE

binasc  proc far  ; convert result to ascii string
 mov  ax, 0
 mov  ax, [result] ; get number to convert
 push  ax  ; save it
 mov  si, offset buff[5]; point to string area
 mov  cx, 10  ; divide base factor
 shl  ax, 1  ; clear sign bit
 shr  ax, 1
do1:  cmp  ax, 10  ; compare with base fact
 jb  exit1
 mov  dx, 0  ; clear upper numerator
 div  cx  ; divide by base factor
 add  dl, 30h  ; convert to ASCII
 mov  [si], dl  ; and store it
 dec  si  ; next character
 jmp  do1
exit1: add  al, 30h  ; convert last character
 mov  [si], al  ; and store it
 pop  ax  ; recover
 or  ax, ax  ; and test for sign bit
 jns exit2
 dec  si  ; store '-' sign
 mov  bl, 2dh
 mov  [si], bl
exit2: ret
binasc endp

start: mov ax, @data
 mov ds, ax
 mov  [result], 0000h ; clear result
 mov  cx, IntAlen ; count of elements
 mov  bx, offset IntArry ; point to IntArry
 mov  si, 0000h  ; first element
 xor  ax, ax  ; clear total
lp1: add ax, [bx + si]  ; add value to total
 inc  si  ; next element
 inc  si
 dec  cx
 jne  lp1
 mov  [result], ax  ; store total
 mov  dx, offset mess ; print message
 mov  ah, 9h
 int  21h
 call  binasc  ; convert result to ASCII
 mov  dx, offset buff
 mov  ah, 9h
 int  21h
 mov  ax, 4c00h ; exit to DOS
 int  21h
 END  start

للامانه منقول

إذا إستعصى عليك فهمه سنحاول انا و الاخوه بعون الله ان نعينك, البرنامج ليس صعب ولكن يحتاج الى قليل من التركيز.

والسلام

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ارجو شرح كيف اظهر الناتج بوسطة int 21h

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم,

نعرف أن المقاطعة 21 مع الدالة ah=9 تظهر الجملة أو الكتابة الموجودة في الذاكرة DS:DX ولهذا إذا كان عندنا عددا ما فالطريقة لإظهاره يمكن أن تكون كالتالي:

- نحول هذا الرقم إلى مجموعة حروف أسكي لنتمكن من إضهارها ونضع النتيجة في مكان ما في الذاكرة.

- نجعل الرجسترات DS و DX تشير إلى مكان هذه الذاكرة ونستدعي الدالة 9 مع المقاطعة 21 .

والمشكلة تبقى في تحويل العدد إلى مقابله في الأسكي والتحويل إلى مقابل الأسكي في نظام الهكس يبقى شيئا ما أسهل من نضيره في نظام العشاري. وهذه الأخيرة يمكن أن نتتبع الطريقة التالية .

كمثال نفترض أنه عندنا الرقم 26548 =x عشاري ونريد أن نحوله إلى مقابله في الأسكي حتى يتم إظهاره. فسنقوم بما يلي :

نقسم الرقم x على 10 قسمة وستعطينا النتيجة y=2654 نظرب مرة أخرى y*10 وستكون النتيجة 26540 وإذا قمنا ب x-y ستكون سنكون قد استفردنا بالرقم الأول يعني هنا 8 وهنا تسهل الأمور علينا لتحويله إلى الأسكي المناسب له وذلك بزيادة الرقم 30 هكس له ونقوم بحفظ النتيجة 38 هكس في مكان في الذاكرة نسميه مثلا Mem .

ولمعرفة الرقم الثاني يعني في مثالنا 4 نقوم بالضبط كما سبق ولكن سنحول الرقم x الذي كان في الأول يساوي 26548 إلى قيمة y التي تساوي 2654 وحين نقسم على 10 سيصبح عندنا y الجديد يساوي 265 وإذا ضربناه في 10 وأنقصناه من الرقم السابق سنحصل على القيمة 4 نزيد لها الرقم 30 هكس لنحولها إلى أسكي وستصبح قيمتها 34 هكس ونحتفض بها في المكان Mem-1 ونعاود الكر من جديد حتى نمر على جميع مكونات العدد.

هذه من بين الطرق والتي أضن أنها السهلة للفهم لأنها تقوم فقط على حسابات رياضية بسيطة.

ويمكن مشاهدة المثال للحاسبة الذي أعطيته في هذا المنتدى وهو يقوم على هذا الأساس.

أتمنى أن تكون قد اتضحت بعض الأمور وإلى اللقاء.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم,

اشكر الأخ chik و احمد غريب

ولكن اريد فكره معينه و اريد برنامج يجمع مثال 35+10=45 عندي خطأ في الفهم و اكرر شكري لللأخ chik و احمد غريب , و الله يعطيكم الصحه و العافيه

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم,

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

فلجمع كما ذكرت 35 + 10 يمكن أن نقوم كالتالي :

mov ax,35

mov bx,10

add ax,bx

هذا كمثال وهنا سيكون عندنا الجمع 45 في الرجستر ax ومن بعد يجب تحويل هذا الرقم إلى جملة حتى يتم طبعها على الشاشة وكما قلت سابقا نقسم 45 على 10 والنتيجة هي 4 نضرب 4 في 10 تساوي 40 وننقصها من العدد الأول أي ستعطينا 5 وهذا هو الرق الأول المكون لنتيجتنا والذي يكون على اليمين.

تبقى لنا من بعد 4 نقسمها مرة أخرى على 10 ستساوي 0 . نضربها في 10 تساوي 0 أيضا وننقسها من العدد السابق أي 4 وستعطينا 4 وهذا هو الرقم الثاني ابتداءا من اليمين. وهذه الطريقة ستقسم لنا العدد الذي نريده إلى الأرقام المكونة له في النظام العشاري ومن تم تسهل تحويل العدد إلى مثيله بجملة وذلك أننا نعرف أن أي رقم من 0 إلى 9 يكون مثيله في الأسكي هو أن نزيد له العدد 30 هكس وهنا أضن أن الأمر واضح.

إلى اللقاء.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم,

اول حاجه اريد اتعلم كيف اتعامل مع ال array بكل احتيجاته مثال كيف اخزن و كيف استرجع مثال برنامج يحجز 8 array نجيب الجمع و الوسط الحسابي كيف اخزن و تاعمليات كلها و ال si كيف يعمل و انا حولت و لكن فشلت لهذا اود ان اعرف كل شي عن ال array و شكرا لللأخ chik علي المساعده

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم,

سأحاول أن أكتب برنامجا بسيطا من هذا النوع وسأحاول وضعه هنا غدا إن شاء الله لنناقشه.

أتمنى أن لا أنسى هذه المهمة علما أنه تدور برأسي أشياءا أخرى.

إلى اللقاء.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم,

كما قلت من قبل سأعطي هنا برنامجين الأول يحول مجموعة أسكي إلى العدد العشاري الموافق له وقد وضعته في ماكرو تحت اسم AtoW والثاني يقوم عكس هذا أي تحويل عدد إلى مثيله من الأسكي واسمه WtoA .طبعا هنا أفترض أن الأعداد كلها من نوع Word وهذا لكي يسهل فهم البرنامج. والطريقة المتبعة لهذا هي الطريقة التي ذكرتها من قبل وأنا أعرف أنها ليست بالطريقة اللبقة إنما هي الأسهل وقد حاولت أن أعطي الكود على الطريقة السهلة الممكنة وأتمنى أني قد وفقت في ذلك.

بعد هذا أعطيت برنامجا بسيطا يستعمل هذين الماكرو وهو برنامج ندخل له عددين عشاريين وسيقوم بجمعهما ويعطينا النتيجة على شكل عدد عشاري أيضا وهنا كذلك الكل يتم على أعداد من نوع وورد.

ليس لدي الآن الوقت الكافي لأعطي كل التفاصيل عنهم. سأعطي الملفات هكذا وإذا كان فيه أي استفسار سأكون إن شاء الله جاهزا لإعطاء أي تفاصيل.

الملف المرفق يحتوي على الملفات التالية :

-TheMac.inc ملف يحتوي على الماكرويات

-Test.asm ملف يشغل الماكرويات

Test.exe ملف مثال لما سبق

Files.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

     




.model tiny
.stack
.data
x dw 1,2,3
sum dw 0
avg dw 0
.code
.startup
mov si,0
mov cx,3
tanna:

mov ax,[x+si]
add sum,ax
add si,2

loop tanna

mov ax,sum
mov cl,3
div cl
mov ah,2
mov dl,al
add dl,30h
int 21h

i want to know whats wrong in this program eng: chik and really thanks to u

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم,

المشكل الأول الذي يبدو على أول وهلة وهو السطر

mov ax,[x+si]

هذا ليس له معنى هنا ف x من المفترض أن تشير إلى عنوان الذاكرة التي تضع فيه الأرقام 1 , 2, 3 . هذا من جهة ومن جهة أخرى يجب أن نعلم أنه وحسب نوع الكمبايلر اللي عندك أننا لا يمكننا كتابة mov ax,[x+si] ففي أغلب الأحيان si تتمشى مع bx حين نريد indexation وحسب ما عندك لا تحتاج إلى Indexation .

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

X dw 1,2,3

فإن هذه المعطيات ستكتب في مكان ما في الذاكرة أي تحت سكمنت وأفست قد يخولها له نظام التشغيل. وحين نشغل برنامجنا فإن السكمنت DS لا يشير بالضرورة إلى نفس السكمنت الذي توجد به معطياتنا وحين نكتب مجرد mov ax,[si] وحتى إذا ما كنا قد أعطينا ل si الأوفسيت الصحيح فسوف لن نعثر على معطياتنا لأننا لا نتواجد في نفس السكمنت.

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

إلى اللقاء .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

ان المشكلة في البرنامج هي طريقة التعريف والكتابة

انك تعرف البرنامج من نوع tiny اي ان البرنامج يتكون من مقطع واحد ويضم جميع المقاطع ومن جهة اخرى تعرف له مقطع البيانات data ومقطع code ومقطع stack

المشكلة الثانية هي startup. الصحيح هو :startup

الحل النهائي هو

model tiny.

code.

org 100h

:startup

mov si,0

mov cx,3

:tanna

mov ax,[x+si] 

add sum,ax

add si,2

loop tanna

mov ax,sum

mov cl,3

div cl

mov ah,2

mov dl,al

add dl,30h

int 21h

mov ah,4ch

int 21h

x dw 10,2,8

sum dw 0

avg dw 0

end startup

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .