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

قراءة/كتابة/تعديل الملفات

مغلق
بدأه white soul في 28 أكتوبر 2005 · 17 رد · 2,056 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

موضوع الملفات في الأسمبلي ؟

من عنده فكرة عن كيفية فتح ملف أوانشاء ملف جديد ،rename file, delete file .......

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

من عنده فكرة ولو قليلة عن الموضوع ؟أرجو المساعدة

: :blink:

Computer Engineer

2007

"اللهم يا مثبت القلوب ثبت قلبي على دينك "

ولدتك امك باكيا والناس حولك يضحكون سرورا

فافعل لنفسك ان تكون اذا بكوا في يوم موتك ضاحكا مسرورا

#2

الامر يتم بواسطة المقاطعات وغالبا ما نستخدم المقاطعة 21h لتنفيذ هذا الامر.. خذ مثلا عى سبيل المثال:

mov dx, offset  fileNM
mov al, 2                                          ; access mode (read and write)
mov ah, 3Dh                                    ; AH:3D (open the file)
int 21h                                              ; execute

يمكنك هنا التاكد من عدم وجود مشاكل بالسطر:

jc noOpen                                  ; goto noOpen on error
; ومن ثم حفظ مقبض الملف
mov handle,ax                           ; save value of handle

وللقراءة:

mov dx, offset  Buffer
mov bx, handle
mov cx, BufSze
mov ah, 3Fh                                ; AH:3F (read file)
int 21h                                          ; execute
jc noRead                                    ; error reading file

ويمكنك مراجعة http://spike.scu.edu.au/~barry/interrupts.html للبقية

وهذا رابط جميل يقدم بعض المعلومات الموسعة: http://www.ilook.fsnet.co.uk/x86/x86file.htm

Do as I say, not as I do

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

#3

بالمناسبة.. هناك حزمة يوجد بها كافة المقاطعات البرمجية في ييئة 16bit تجدها في هذا الموقع: http://www.cs.cmu.edu/~ralf/files.html

وقد قمت بتعديل عنوان الموضوع لاني لم افهم ما الذي يعنيه :blink:

Do as I say, not as I do

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

#4

شكرا لتعاونك معي

أكيد رح أستفيد كتير من الموقعين

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

:rolleyes:

Computer Engineer

2007

"اللهم يا مثبت القلوب ثبت قلبي على دينك "

ولدتك امك باكيا والناس حولك يضحكون سرورا

فافعل لنفسك ان تكون اذا بكوا في يوم موتك ضاحكا مسرورا

#5

هلأ أنا كتيت كود بسيط لفتح ملف وهذا لملف موجود ،الملف من نوع نص وكتبت الأمتداد كما هو لازم لكنه وضع خطأ قيمته 3 في المسجل ax وأعطاني رسالة تقول أن الملف غير موجود

org  100h	
mov ah,3dh
mov al,0
mov dx,offset file1
int 21h
hlt
file1 db 'ruba.txt'

على فكرة انا بشتغل على emu8086

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

Computer Engineer

2007

"اللهم يا مثبت القلوب ثبت قلبي على دينك "

ولدتك امك باكيا والناس حولك يضحكون سرورا

فافعل لنفسك ان تكون اذا بكوا في يوم موتك ضاحكا مسرورا

#6

ان كنت قد حفظت البرنامج او عملت emulate له وهو في نفس المسار الذي يوجد به الملف النصي فليس من المفترض ان يحصل اي خطا.. بالتالي افحص التالي:

1- قم بحفظ ملف الاسمبلي في نفس المجلد الذي به الملف النصي.

2- قم بتجميع الملف المصدري الى تنفيذي وضعه في نفس المجلد..

3- ان قمت باستخدام jc لتحديد ان كان الملف موجودا ام لا فاذن الـ CF لن تحمل قيمة والذي يعني فتح الملف بنجاح والا سيتم تنفيذ الـ JC وتظهر رسالة الخطا..

ان استمر الخطا بالظهور زودني بصورة او بتفاصيل اكثر.. بالمناسبة، يمكنك الاستعاضة عن mov ah, 03dh / mov al, 0h بـ mov ax, 3d00h

تحياتي

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

Do as I say, not as I do

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

#7

قي الحقيقة ما زال الخطأ موجود مع اني وضعت الملف المراد فتحه وملف الكود في فولدر واحد داخل بناء emulator وكانت الرسالة التي تظهر على الشكل التالي :

file does not exist:

C:\emu8086\MyBuild\ruba.txtô

interrupt error: 21h/3Dh : cannot open file.

شكرا للتعاون .

Computer Engineer

2007

"اللهم يا مثبت القلوب ثبت قلبي على دينك "

ولدتك امك باكيا والناس حولك يضحكون سرورا

فافعل لنفسك ان تكون اذا بكوا في يوم موتك ضاحكا مسرورا

#8

لحظة شوي.. انت عم تستخدمي السطر التالي؟

file1 db 'ruba.txt'

كافة السلاسل في الاسمبلي يجب ان تنتهي بمؤشر يدل على نهاية السلسلة.. في emu8086 يتم استخدام $ في نهاية السلسلة النصية.. اما في هذا المثال فاستخدمي الدليل التالي

file1 db 'ruba.txt', 0

Do as I say, not as I do

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

#9

اكتشفت اني نسيت اكتب الصفر :o لما أضفته تغيرت الرسالة لكن بقي في خطأ مخزن في ax

the emulator is halted. هذه الرسالة تظهر وعي تظهر عادة عند الأنتهاء من تنفيذ اي برنامج بنجاح لكن قيمة الخطأ المخزن في المسجل هي 5 ويعني access denied ويعني كما أظن ان عملية المعالجة غير مسموح بها :wacko:

على فكرة قمت بانشاء ملف create file وتمت العملية بنجاح :D لكن فتح الملف مش عارفة ليش معلق ؟

والسلام

Computer Engineer

2007

"اللهم يا مثبت القلوب ثبت قلبي على دينك "

ولدتك امك باكيا والناس حولك يضحكون سرورا

فافعل لنفسك ان تكون اذا بكوا في يوم موتك ضاحكا مسرورا

#10

أخي ليكون عملك نضيف

يجب غلق الملف قبل الخروج

mov ah,3e;Close file
int 21
d4baa0.gif
#11
org  100h; set location counter to 100h
mov ah,3ch
mov dx,offset file1
mov cx,00000000b; read and write file
int 21h
jc l3
jmp l1
l3: mov dx,offset m
mov ah,9h
int  21h  
l1:mov filehandle,ax
mov ah,00
int 16h
cmp al,0
je l1
cmp al,27
je l2
mov si,offset outbuffer
mov [si],al
mov ah,40h
mov bx,filehandle
mov cx,10
mov dx,offset outbuffer
int 21h
jmp l1              
l2:mov ah,3eh;Close file
int 21h 


hlt
m db 'there is an error $'
file1 db 'ruba3.txt',0
filehandle dw ?
outbuffer db ?
; the program ended successfully

delta Aziz هذا هو الكود اللي عملته قمت باغلاق الملف كما أشرت أخ

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

أما موضوع فتح ملف فما زال معلق ؟؟؟

تم تعديل هذه المشاركة بواسطة Xacker في 31 أكتوبر 2005 في 02:30

Computer Engineer

2007

"اللهم يا مثبت القلوب ثبت قلبي على دينك "

ولدتك امك باكيا والناس حولك يضحكون سرورا

فافعل لنفسك ان تكون اذا بكوا في يوم موتك ضاحكا مسرورا

#12

انا لا اعلم لم تقومين باستخدام emu8086 لكتابة تطبيقاتك.. حتى ولو كانت بسيطة.. برايي حتى وان كانت كتابة هذه التطبيقات ببيئة 32bit وباستخدام تعليمات محصورة في العادة ببيئة 16bit كالمقاطعات وغيرها من المسجلات التي لا يمكن الزيادة في طولها حتى 32 بت.. والحجم الذي يضاف الى الحجم الاصلي للكود المكتوب (512 بايت للترويسة) فان هذا لا يمنع من ان تقومي بالانتقال فورا الى بيئة 32bit والاحتفاط بالستايل القديم لبرنامجك في التعامل مع المقاطعات مبدئيا..

او يمكنك استخدام masm16 .. لكن في حال كنت تعملين على بيئة XP.. و 2k? استخدمي emu8086 لان المقاطعة 21h ليست مدعومة بالشكل المطلوب مما يسبب الكثير من الاخطاء اثناء التنفيذ..

باي حال، في المرفقات نص الكود لانشاء ملف، الكتابة فيه، اغلاقه.. بالنسبة للحذف واعادة التسمية.. اعتقد الموضوع لن يكون صعبا..

والسلام خير الختام B)

;=====================================
; copyright 2005 (c) ArabTeam2000
;=====================================
	.model	small

.data  ; required for the stupid emu8086
  ; can not include data here! o_O

.code
	org	100h

start:
	jmp	main; jump past data *usually appears in VX pointing to the decryption routine :p*

file1  db	"ruba.txt", 0
m  db	"there is an error", 0
filehandle	dw	?
outbufferpar	label	byte	; * file record set
maxlen  db	27	; *
actlen  db	?	; *
outbuffer	db	27 dup (?); *

;---------------------------------------------
main	proc	near

;=======
; CREATE FILE
;=======
	mov	ah, 3Ch  ; create file request
	mov	cx, 0  ; file attributes
	lea	dx, file1	; file ascii name
	int	21h  ; execute interrupt
    ; limited under XP for asm16bit
	jc	error  ; error creating file?
	mov	filehandle, ax	; no, store file handle in 'filehandle'

;=======
; RECIEVE INPUTS
;=======
	mov	ah, 0Ah  ; input request
	lea	dx, outbufferpar; load effective addr of 'outbufferpar' into dx
	int	21h  ; execute
    ; now the program waits for bytes to be entered
    ; this input request determines the maxlen
    ; of the string to be entered and notifies
    ; the user with a beep sound when reachs the maxlen

;=======
; WRITE FILE
;=======
	mov	ah, 40h  ; write file request
	mov	bx, filehandle	; move filehandle into bx
	mov	cl, maxlen	; num of bytes written
	lea	dx, outbuffer	; load addr of the buffer
	int	21h  ; execute

;=======
; CLOSE FILE
;=======
close_file:
	mov	ah, 3Eh  ; close file request
	mov	bx, filehandle	; move file handle to bx
	int	21h  ; execute interrupt
	ret

;=======
; ERROR
;=======
error:
	mov	ah, 40h  ; display request
	mov	bx, 1  ; handle
	mov	cx, 17  ; length of message
	lea	dx, m  ; load effective addr into dx
	int	21h  ; execute
	ret 	 ; return to DOS
main	endp
;---------------------------------------------
	end	start

read_write_close.zip

Do as I say, not as I do

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

#13

شكرا للمساعدة لقد تم انشاء الملف والكتابة فيه بنجاح لكن بقيت مشكلة فتح الملف مازال الخطأ رقم 5 المخزن في ax يظهر ؟

Computer Engineer

2007

"اللهم يا مثبت القلوب ثبت قلبي على دينك "

ولدتك امك باكيا والناس حولك يضحكون سرورا

فافعل لنفسك ان تكون اذا بكوا في يوم موتك ضاحكا مسرورا

#14

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

تحياتي

Do as I say, not as I do

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

#15
org  100h; set location counter to 100h
main	proc	near
Mov ah,3dh
Mov al,02 ; open file for reading and writing
mov dx,offset File1
Int 21h  
Jnz L1 ; if carry flag=1 then there is an error jump to hlt(end the prigram)
mov	filehandle, ax	; no, store file handle in 'filehandle'
;display amessage
Mov ah,9
Lea dx,m
Int 21h   



;=======
; RECIEVE INPUTS
;=======
	mov	ah, 0Ah  ; input request
	lea	dx, outbufferpar; load effective addr of 'outbufferpar' into dx
	int	21h  ; execute
    ; now the program waits for bytes to be entered
    ; this input request determines the maxlen
    ; of the string to be entered and notifies
    ; the user with a beep sound when reachs the maxlen

;=======
; WRITE FILE
;=======
	mov	ah, 40h  ; write file request
	mov	bx, filehandle	; move filehandle into bx
	mov	cl, maxlen	; num of bytes written
	lea	dx, outbuffer	; load addr of the buffer
	int	21h  ; execute

;=======
; CLOSE FILE
;=======
close_file:
	mov	ah, 3Eh  ; close file request
	mov	bx, filehandle	; move file handle to bx
	int	21h  ; execute interrupt
	ret

;=======
; ERROR
;=======
l1:
	mov	ah, 40h  ; display request
	mov	bx, 1  ; handle
	mov	cx, 17  ; length of message
	lea	dx, m  ; load effective addr into dx
	int	21h  ; execute
	ret 	 ; return to DOS
main	endp
;---------------------------------------------



hlt
file1  db	"ruba.txt", 0
m  db	"there is an error", 0
filehandle	dw	?
outbufferpar	label	byte	; * file record set
maxlen  db	27	; *
actlen  db	?	; *
outbuffer	db	27 dup (?); *

هي كتبت الكود متل ما بدك من شان ما تتغلب

طبعا هذا الملف File1 تم انشاؤه سابقا متل مل كتبت انت الكود والذي تم تنفيذه بنجاح

طبعا هدا الكود ما عم يتنفذ عم تتطلع الرسالة الي بتقول انه في خطأ يعني يقفز الى l1 بسبب عدم النجاح في فتح الملف

عفكرة في اشي غريب لو وضعت jc المفروض يقفز لو كان هناك حمل في الflag RG وذلك يعني وجود خطأ بس عند التنفيذ ما بيقفزالا إذا وضعتjnc مع العلم بوجود حمل في Ax اللي بدل طبعا على وجود حمل في flag RG

وبالنسبة للتغيير عن emu8086 فهي بدأت أتعلم الmasm ان شاء الله يجيب نتيجة.

Computer Engineer

2007

"اللهم يا مثبت القلوب ثبت قلبي على دينك "

ولدتك امك باكيا والناس حولك يضحكون سرورا

فافعل لنفسك ان تكون اذا بكوا في يوم موتك ضاحكا مسرورا

#16

حسنا ساعود بالرد بعد قليل او بكرة بالكتير.. مستعجل هلأ لازم روح اقرا شوية من محاضراتي.. حرام الكلية الها علي حق :P

Do as I say, not as I do

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

#17

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

أخى الفاضل Xacker

البرنامج الموجود فى المشاركة 12 لايشتغل مع الكمبايلر Tasm فما السبب ؟؟

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

#18

لاني اعمل على masm, للاسف لا اعمل على tasm, هناك حاجة لبعض التعديلات ليعمل.. فقط في بعض التوجيهات وما شابه

Do as I say, not as I do

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

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

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