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

برنامج بسيط به أخطاء في استخدام المقاطع

بدأه طارق عبيد في 24 مايو 2009 · 5 رد · 821 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته ،

لقد حاولت ان أكتب برنامجاً يقوم بطباعة جملة في لغة Assembly من خلال استخدام القطاع ولكن ظهرت لدي ثلاثة أخطاء ، ولقد حاولت دون الوصول إلى حل..

ماذا تعني الأخطاء التي ظهرت ؟

والبرنامج كالتالي :

.model small
.stack 100h
.data
.code
data segment
hi db 'Palestine my country$'
data ends
code segement
assume cs:code,ds:data
start: mov ax,@data
	   mov ds,ax
	   mov ah,09h
	   mov dx,offset hi
	   int 21h
	   mov ah,4ch
	   int 21h
code ends
end start

تم تعديل هذه المشاركة بواسطة طارق عبيد في 24 مايو 2009 في 11:18

#2
.model small
stack segment
stack ends
data segment
hi db 'Palestine my country$'
data ends
code segment
assume cs:code,ds:data
start: mov ax,@data
	   mov ds,ax
	   mov ah,09h
	   mov dx,offset hi
	   int 21h
	   mov ah,4ch
	   int 21h
code ends
end start

لم تكتب نص الأخطاء التي ظهرت، يرجى في المرات القادمة وضع كافة المعلومات.

لديك خطأ إملائي في كتابة segment الثانية.

قمت بتعديل البرنامج بحيث لا يبدأ عند 100h لأن DS تكون عند 0h

تم تعديل هذه المشاركة بواسطة Xacker في 24 مايو 2009 في 11:53

Do as I say, not as I do

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

#3

المشكلة أخي في Compile time حيث تظهر لي 3 أخطاء Severe حينما اقوم بتنفيذ masm

وهل لك ان توضح لي compile-time & run-time ؟

وشكراً لجهودك

masm filename.asm;

تم تعديل هذه المشاركة بواسطة طارق عبيد في 24 مايو 2009 في 12:11

#4

كما قلت لديك خطأ إملائي فيما عدا هذا فبرنامجك الأول يجب أن يتم عمل assemble له بدون مشاكل لكن عند التنفيذ فهناك بعض الأخطاء البرمجية

هل تفكر بما أفكر

حان وقت الاقتباس

ORG 100h is a compiler directive (it tells compiler how to handle the source code). This directive is very important when you work with variables. It tells compiler that the executable file will be loaded at the offset of 100h (256 bytes), so compiler should calculate the correct address for all variables when it replaces the variable names with their offsets. Directives are never converted to any real machine code.

Why executable file is loaded at offset of 100h? Operating system keeps some data about the program in the first 256 bytes of the CS (code segment), such as command line parameters and etc.

Though this is true for COM files only, EXE files are loaded at offset of 0000, and generally use special segment for variables.

فكما ترى أنت هنا تخبر الكومبايلر أن برنامجك سيبدأ عند الإزاحة DS:100 لكن فعلياً البيانات لديك ستبدأ عند الإزاحة DS:00 بالمقطع DATA ويكمل بعدها البرنامج ببقية المقاطع... لذلك لو قمت بتشغيل برنامجك بعد تجميعه ستجد أنه سيقوم بطباعة garbage ثم تظهر الجملة التي كتبتها، لو حسبت المساحة التي تظهر على الشاشة وفيها garbage ستجدها 100 بايت بالضبط :)

اكتب كما تشاء، احجز مساحة للـ stack فقط مع تطبيقات COM أما في EXE فلن يلزمك هذا.

تم تعديل هذه المشاركة بواسطة Xacker في 24 مايو 2009 في 12:38

Do as I say, not as I do

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

#5

شكراً لك أخي الكريم .. لقد تم تنفيذ البرنامج بنجاح.

انا في بداية تعلمي لهذه اللغة ..

ولكن حينما نفذت الامر link لهذا الملف يظهر لي:

Warning L4021: no stack segment

هل لك ان تذكر لي السبب ؟

وكيف لي عمل print screen من خلال شاشة الدوس؟

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

#6

الرسالة مجرد تنبيه وليس خطأ يمنع البرنامج من العمل.. لكونه يفترض أنك تحاول كتابة ملف COM.

بخصوص print screen من الدوس لم أجرب من قبل ولا أعلم إن كان ممكن.. ربما أبحث، ربما لا، لو وجدت شئ سأبلغك.

Do as I say, not as I do

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

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

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

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

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

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