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

[ تمت الإجابة ]كيف أقرأ أرقام من ملف نصّي وأجمعها

بدأه muvbmu في 13 يناير 2010 · 1 رد · 752 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

حبيت استفسر عن برنامج قمت بعمل نصفه لكن واجهتني بعض العوائق

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

ثم داخل المستند فيه ارقام يجمع الارقام بإستخدام جملة تكرار << هذه المشكله الاولى ما اعرف ايش كود جملة التكرار التي تجمع بين الارقام

المشكلة الثانيه ان الارقام بيعتبرها البرنامج كـ سترنق وليس ارقام فما الطريقه لتحويلها ؟؟

شاكر ومقدر جهدكم

model small
.stack 
.data

,"&"msg_error_creating DB 13,10," ***********Error creating the file*********** ",13,10

myfile DB "c:\myfile2.txt",0

.code
:start
      mov ax,@data
   mov ds,ax
mov dx, offset myfile
     xor cx,cx
     mov ah,3ch
     int 21h
 jc Error_Creating

:Error_Creating

mov ah,9h
mov dx, offset msg_error_creating
int 21h

Jmp Close

 :Close

mov ax,4ch
int 21h

end start

تم تعديل هذه المشاركة بواسطة muvbmu في 13 يناير 2010 في 23:43

#2

بالنسبة لجمع الأرقام وهي بصيغة ASCII كان عليك مراجعة الأسئلة السابقة الموجودة في الأرشيف..

انظر هذه المشاركة #6

/index.php?showtopic=210168&view=findpost&p=1044450

ما عليك القيام به الآن،

قراءة محتوى الملف وتخزينه في الذاكرة كسلسلة نصيّة في متحول اسمه str مثلاً.

حلقة التكرار ستقوم بالمرور على هذه السلسلة بايت تلو الآخر..

بالتالي نستطيع القول أنها كالتالي

for (pos = 0; pos < strLen; pos++)
{
	...
}

pos = متغير عددي يحدد موضع الحرف الحالي الذي سيتم التعامل معه. يمكن التعبير عنه بمسجل register قيمته الابتدائية 0 ويزداد بمقدار 1 في كل خطوة (pos++)

strLen = متغير عددي يمثل طول السلسلة التي تمت قراءتها من الملف النصي، يمكن التعبير عنه إما بمسجل register قيمته ثابته على طول الحلقة أو التعبير عنه ببايت محجوز مسبقاً

strLen 	db 	?

يتم وضع طول السلسلة فيه لاحقاً.

ونقوم بتمثل الحلقة السابقة بالشكل التالي

			; cx = strLen (محسوبة مسبقاً)
xor	bx,bx		; pos = 0
enter_for:
cmp	bx,cx		
jnl exit_for		; pos >= strLen? yes --> exit
			; pos < strLen
...
inc	bx
jmp	enter_for
exit_for:

سنفترض أن كل رقم داخل الملف يتم وضعه في سطر مستقل

بالتالي كسلسلة نصية ما يفصل بين الأسطر ستكون قيمة CR,LF أي (Carriage Return, Line Feed) وهي تمثّــَل بالقيمة 0Dh,0Ah على الترتيب.

سنقوم بفحص كل بايت من هذه السلسلة، ننظر هل هو digit، أم هو CR char (أي 0Dh)

سنضع عنوان السلسلة النصية في مسجّل مثل SI، بنقل عنوان الذاكرة إليه إما بـ MOV أو LEA تبعاً للطريقة التي تم حجز عنوان السلسلة النصية في الذاكرة بها عند قراءة محتوى الملف..

بالتالي التصور الحالي للحلقة وما يليها من عمليات يكون

			; cx = strLen (محسوبة مسبقاً)
			; si = عنوان السلسلة النصيّة
xor	bx,bx		; pos = 0
enter_for:
cmp	bx,cx		; قارن pos مع strLen
jnl	exit_for		; pos >= strLen? yes --> exit
			; pos < strLen
mov	al,[si+bx]		; al = بايت من السلسلة وفق قيمة BX
cmp	al,0Dh		; al = CR char?
jne	digit		; no, بالتالي هو رقم
add	bx,2		; skip CRLF
jmp	enter_for
digit:
	; ستستفيد من فكرة إجرائية atodw التي كتبتها في المشاركة على الرابط أعلاه
	; كل عدد تنتهي من تحويله إلى هكس ضعه في المكدس
inc	bx
jmp	enter_for
exit_for:
	; ليكن لديك متغير يشير إلى عدد الأرقام الموجودة في الملف
	; بالتالي تضيف حلقة مجالها عدد الأرقام
	; تقوم بسحب الأعداد من المكدس وتجمعها كـ هكس
	; نهاية تقوم بتحويلها إلى ASCII بإجرائية dwtoa الموجودة على الرابط أعلاه أيضاً

جرب القيام بهذا الأمر من خلال هذه الإرشادات.

بانتظار محاولتك الجادة.

Do as I say, not as I do

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

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

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

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

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

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