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

برنامج تقسم رقمين

بدأه ghith-js في 18 يونيو 2011 · 2 رد · 961 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سلام عليكم

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

ولكم جزيل الشكر

IDEAL
P386
p387
LOCALS
MODEL MEDIUM

; 
include "mnemonic.inc"

SEGMENT sseg para stack 'STACK'
DB 400h DUP(?)
ENDS

DATASEG
Txt1 DB 1,0,"",0
     DB 3,0,":",0
     DB 4,0,":",0
     DB 5,0,"",0
ENDS


CODESEG
;*****************************
;* *
;*****************************
PROC Arithmetic
        mov     AX,DGROUP
        mov     DS,AX
;
        mov     AX,3
        int     10h

        finit
; 
        mov     SI,offset Txt1
        call    ShowString
        call    ShowString
        call    ShowString
        call    ShowString

; 
        mov     [ScreenString],3
        mov     [ScreenColumn],24
        finit
        call    GetFloat
        fld    [Data_Double]
        fst    [MyDouble1]

; 
        mov     [ScreenString],4
        mov     [ScreenColumn],24
        finit
        call    GetFloat
        fld    [Data_Double]
        fst    [MyDouble2]


; 
     ; 
        finit
        fld [MyDouble1]
        fld [MyDouble2]
	   fdiv
        fst [Data_Double] 

; 
        mov     [ScreenString],5
        mov     [ScreenColumn],24
        call    DoubleFloat_to_string
        call    ShowDataString

mov     [ScreenString],25
        mov     [ScreenColumn],0
        call    SetCursorPosition
        call    GetChar

; 
        mov     AX,3
        int     10h
; 
        mov     AH,4Ch
        int     21h
ENDP Arithmetic 



ENDS

; 
include "ios.inc"
; 
include "trans.inc"

END

تم تعديل هذه المشاركة بواسطة Xacker في 18 يونيو 2011 في 18:14 — السبب: تنسيق الكود -_-

#2

حتى يستطيع أحد القيام بشرح البرنامج بالضبط فعليه أن يحصل على ملفات include، لكن لا مشكلة، سأقوم بشرح الجزء المتعلق بالقسمة فقط

        mov     [ScreenString],3
        mov     [ScreenColumn],24
        finit
        call    GetFloat
        fld    [Data_Double]
        fst    [MyDouble1]

أول سطرين لا يهمّاني لأنها غالباً تنسيقات عرض على الشاشة والتفاصيل ستكون في الوظائف الموجودة في ملفات include

تعليمة finit ستقوم بتهيئة مسجلات المعالج المساعد المسمّى FPU.

fld ستقوم بتحميل load القيمة الموجودة في Data_Double إلى المسجل st0.

fst ستقوم بتخزين store القيمة الموجودة في st0 -- في الذاكرة المعنونة بـ MyDouble.

بالتالي الأمر يشبه، اقرأ قيمة من المستخدم، قم بتحميلها في مسجّل المعالج المساعد واحتفظ بنسخة عنها في MyDouble1.

الجزء الذي يلي الكود السابق مشابه له، وهو خاص بالقيمة العددية الثانية.

نأتي لجزء جديد هو:

        finit
        fld [MyDouble1]
        fld [MyDouble2]
           fdiv
        fst [Data_Double]

مرة أخرى، تهيئة لمسجلات المعالج المساعد.

ثم دفع القيمة MyDouble1 إلى المسجّل st0.

ثم دفع القيمة MyDouble2 إلى المسجّل st0 ونقل ما كان في st0 إلى st1.

ثم تطبيق عملية قسمة بـ fdiv

ثم تخزين القيمة الموجودة في st0 (ناتج القسمة) في العنوان المشار إليه بـ Data_Double.

أخيراً كما ترى، مجرد عملية تحويل للعدد إلى سلسلة نصّية حتى يكون بالإمكان إظهاره على الشاشة.

        mov     [ScreenString],5
        mov     [ScreenColumn],24
        call    DoubleFloat_to_string
        call    ShowDataString

إن أردت أن تتعلم أكثر عن FPU، وصدّقني هي هامة للتعامل مع الأرقام الحقيقية والعشرية، عليك بمقالات ريموند:

http://www.website.masmforum.com/tutorials/fptute/

بالتوفيق

Do as I say, not as I do

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

#3

جزاك الله كل خير xacker

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