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

حاولت عمل برنامج لكن ظهرت لي مشكلة

مغلق
بدأه allko في 3 سبتمبر 2005 · 6 رد · 572 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

في احد المواضيع طلب احد الاعضاء حلا للسؤال التالي

اقتباس
Write a program to compute sum of odd integers

: 1+3+….+N

The final sum should be stored in memory

لقد حالوت حل السؤال (افترضت ان N تساوي 50 عشري)وقمت بكتابة البرنامج التالي

mystack     SEGMENT STACK    ;Stack  ensures loading  SS by DOS
                   DB 512 DUP (?)            ;reserves 512K for  stack
mystack     ENDS



mydata      SEGMENT
N           DW     32H          ;32h equles 50 decimal
SUM        DW     (?)
mydata      ENDS



myprog      SEGMENT

          ASSUME CS:myprog,DS:mydata
Main        PROC
START:                          ;Get The Party Started!!
            mov cx,1            ;start counting from 1
            mov SUM,1          ;start adding from 1
            mov ax,N            ;store the value of N
            addition:          ;here the addition begins
            inc cx              ;increase cx
            inc cx              ;2 inc,to get an odd number
            add SUM,cx          ;move the result to  SUM
            cmp cx,N            ;compare value in cx with N
            jne addition        ;if equale:end,otherwise jumpe to addition

Main        ENDP
myprog      ENDS
END START

في الواقع الstack & data segments

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

لكن الكود الرئيسي للبرنامج من عملي الشخصي

المشكلة هي بعد عمل assembling & linking والحصول على ملف

exe ظهرت المشكلة التالية عند محاولت تشغيله

03_09_05_07_57_18_1125759438odd.GIF

فالرجاء ممن لديه الحل ان يدلني علي وانا شاكر لكم

واعتذر عن كثرة ازعاجي لكم بالاسئلة هنا وهناك

تحياتي

تم تعديل هذه المشاركة بواسطة allko في 3 سبتمبر 2005 في 18:04

#2

أين كود الخروج ؟

jne addition
mov ah,4ch
int 21h

تم تعديل هذه المشاركة بواسطة DeltaAziz في 3 سبتمبر 2005 في 18:29

d4baa0.gif
#3

ولتحسين المحمولية:

.model small                  ; memory model
.stack 64                      ; reserve 64kb (com based file)
.data
sum	dw	0                      ; declare word & null it

.code
start:
        mov     ax, 1          ; set 1 to AX
        mov     sum, 1        ; set 1 to sum
addition:
        inc     ax            ;
        inc     ax            ; 2 incs to get an odd
        add     sum, ax        ; add the odd num to the sum
        cmp     ax, 32h        ; is it 50 yet?
        jne     addition      ; no -> continue adding
exit:
        mov     ah, 4Ch        ; dos service, end & return
        int     21h            ; call interrupt
end start

تم تعديل هذه المشاركة بواسطة Xacker في 3 سبتمبر 2005 في 20:21

Do as I say, not as I do

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

#4

فعلا كان ينقصني كود الخروج

شكرا لك اخDeltaAziz

اخ xacker يبدو ان كود البرنامج الذي قدمته انت افضل من الذي قدمته انا :rolleyes:

لكنني لم افهم اول سطرين في برنامجك رغم انني دائما ما اشهدهما في الاكواد الموضوعة في المنتدى

يبدو انني كنت اخصص (او بالاحرى كاتب الكتاب كان يخصص) سيجمنت كاملة للستاك واخرى للداتا بينما انت اختصرتهما

فضلا لا امرا اشرح لي السطرين الاولين

model small.

stack 64.

تحياتي

تم تعديل هذه المشاركة بواسطة allko في 3 سبتمبر 2005 في 21:13

#5

السلام عليكم

جمع اعداد من 1 إلى N من اساسيات الرياضيات, لذلك يمكنك إستخدام معادلة الarithmetic sum وفى هذه الحاله تكون المعادله على النحو التالى

1+3+….+N = N(N+1)/2

يعنى العدد الاول زائد العدد الاخير فى نصف عدد الارقام التى نريد جمعها

طبعاً الشرح اى كلام ولكن اعتقد ان الفكره سوف تصل للقاراء

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#6

مشكور اخي احمد على هذه الفكرة [ :

اخي allko بالنسبة لتوجيه .model فهو بيحدد نموذج الذاكرة المستخدم من قبل البرنامج.. وبيقبل احدى المعاملات التالية: small, medium, large, compact وفيه huge.. اما بالنسبة للـ 32bit فمجبر على flat

النموذج small: بيحدد انه عدد المقاطع اللي ممكن تتوضع فيها التعليمات هي 1 - عدد المقاطع اللي ممكن تتوضع فيها المعطيات 1

medium: اكثر من 1 - 1

compact: العدد 1 - اكثر من 1

large: اكثر من 1 - اكثر من 1

مع تطبيقات 16bit فيكون النموذج small افضل شي.. لانه ما رح تحتاج غيره ! الا اذا كتبت برنامج مو طبيعي بيتطلب اكثر من 64k.. فيروس مفيد (KOH؟) :)

هالنموذج بيتطلب انه تكون التعليمات ضمن مقطع حجمه ما بيتجاوز 64k والمعطيات بمقطع تاني حجمه ما بيتجاوز 64k ايضا وهالشي بيدل ضمنا على اننا بنحتاج بس الى عنونة بطول 16بت لعنونة اي معطيات في البرنامج.

اما التوجيه .stack فبنستخدمه لنحجز فراغ عشان المكدس ولاحظ انه حجم المكدس ماله علاقة بنوع الذاكرة.. يعني بتقدر تحجز 256 بايت مثلا (100h) لنوع ذاكرة small.

تم تعديل هذه المشاركة بواسطة Xacker في 4 سبتمبر 2005 في 03:48

Do as I say, not as I do

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

#7

شكرا اخ احمد على الفكرة

وشكرا جزيلا للاخ xacker على التوضيح

تحياتي

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

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…