ورود

View Full Version : خواندن از انتهای فایل به صورت معکوس & معادل تابع delay



HosseinProgrammer
شنبه 22 دی 1386, 17:56 عصر
سلام.
دو تا سوال داشتم.
یک اینکه چطور میشه اطلاعات رو از انتهای یک فایل به صورت معکوس خوند؟ (اشاره گر فایل را به انتها برده و برای خواندن به عقب بیاییم.)

دوم اینکه معادل تابع delay سی در اسمبلی چیه؟

با تشکر.

Delphi Coder
شنبه 22 دی 1386, 23:24 عصر
لطفا مشخص کنید در مورد کدوم OS صحبت میکنید FileManagment مقوله ای هست که تو صرف زبان اسمبلی مستقل از OS هیچ مفهومی نداره. همچنین در مورد Delay و اگر هم ممکنه دلیل اینکه میخواید فایل رو برعکس بخوانید رو بگید.

HosseinProgrammer
یک شنبه 23 دی 1386, 07:30 صبح
قسمتی از برنامه ای که دارم می نویسم اینه که user name & password و تاریخ اونارو میگیره و در فایلی ذخیره میکنه. البته از این فایل هیچ وقت نباید اطلاعات پاک بشن یعنی در قسمت تغییر رمز ، رمز جدید به همراه user و تاریخ و ساعت به انتهای فایل اضافه میشه و جدیدترین رمز هم باید به رسمیت شناخته بشه. پس یک راه اینه که فایل رو از انتها پیمایش کنم.

ضمنا من در 8086 کار میکنم.

با تشکر...

Delphi Coder
یک شنبه 23 دی 1386, 08:25 صبح
تحت کدوم OS؟
DOS یا Windows یا Linux یا .....؟؟؟

همه OS ها یه سرویس در اختیارتون میذارن که بتونید اشاره گر فایل رو حرکت بدید و بعد اون رو بخوانید یا بنویسید منتها وقتی سوال واضح نیست یا باید یه کتاب برای پاسخ نوشته بشه یا سوال بی جواب بمونه یا اینکه برنامه نویسی مثل خودتون که مثلا چون با اسمبلی ویندوز کار کرده و Assembly رو مختص ویندوز میدونه بیاد با API جواب بده یکی با وقفه جواب بده و ...

HosseinProgrammer
یک شنبه 23 دی 1386, 11:49 صبح
DOS
و با برنامه ی emulator 8086 4.05 (Compiler FASM)

با سرویس 42h وقفه 21h اشاره گر رو به انتها میبرم (al = 2). و میخوام در این حالت اشاره گر رو یکی به طرف اول فایل ببرم و 1 کاراکتر بخونم و دفعات بعدی اشاره گر رو دو بار به طرف ابتدای فایل ببرم و باز هم یک کاراکتر بخونم.
فکر کنم منظورمو متوجه شده باشید.

Delphi Coder
یک شنبه 23 دی 1386, 21:07 عصر
تو فایل ضمیمه یه مثال گذاشتم که از انتهای فایل 14 بایت میاد عقب و 14 بایت می خونه البته با TASM اسمبل میشه که فکر نمی کنم برای شما مهم باشه. سرویس 42 وقفه 21 رو یک بار دیگه مطالعه کنید زمانی که al رو 2 پاس میدید Offset نسبت به انتهای فایل در نظر گرفته میشه. اگر منبع خوبی برای وقفه ها سراغ ندارید میتونید از HelpPC که تو اعلان همین قسمت ضمیمه شده استفاده کنید.

HosseinProgrammer
دوشنبه 24 دی 1386, 08:54 صبح
ممنون از جوابتون. واقعا مفید بود.
ولی یک مورد هنوز برای من مشخص نشده! از اینطرفو اونطرف هم چیزی دستگیرم نشد!
اینکه چرا cx رو منفی یک قرار میدید؟

سوال دوم که تو این سوال محو شد معادل تابع delay سی بود در اسمبلی.

با تشکر

HosseinProgrammer
سه شنبه 25 دی 1386, 10:42 صبح
آقا کسی نیست جواب ما رو بده؟!:افسرده:

Delphi Coder
پنج شنبه 27 دی 1386, 15:28 عصر
cx منفی 1 نیست در حقیقت offset توی CX:DX هست و offset رو منفی قرار دادیم چون AL=2 هست و می خوایم از انتهای فایل عقب برگردیم.
بهتره سوال دوم رو تو تاپیک دیگه می نوشتید چون ارتباطی با سوال اول نداشت.

دوم اینکه معادل تابع delay سی در اسمبلی چیه؟
معادل نداره باید تابعشو خودتون بنویسید. به نظر من بهتره از سرویس 0 وقفه 1a استفاده کنید هر ثانیه تقریبا 206/18 تا اضافه میشه.

HosseinProgrammer
جمعه 28 دی 1386, 15:13 عصر
ممنون از جوابتون. در مورد delay ، سرویس 86 از وقفه 15 رو پیدا کردم ولی فقط در صورتی جواب میده که فایل exe رو از توی داس اجرا کنیم!


-------------------------------------------------------------------

سوالی هم پس از این سوالات برام پیش اومد و اونو توی همین تاپیک مطرح میکنم چون مربوط به فایل و اشاره گر میشه:
چطور میشه در ابتدای فایل یک جمله رو اضافه کرد یعنی اطلاعات قبلی پاک نشه (جمله جدید جایگزین جمله قبلی نشه.)

Delphi Coder
جمعه 28 دی 1386, 19:05 عصر
نمیشه. باید کل فایل رو به جلو شیفت بدید.

HosseinProgrammer
شنبه 29 دی 1386, 09:53 صبح
دوباره سلام! در مورد اینکه کل فایل رو باید شیفت بدیم برنامه ای نوشتم ولی درست کار نمیکنه! نمیدونم مشکلش کجاست...
این برنامه کاراکتر $ رو ابتدای یک فایل اضافه میکنه.
ابتدا کل فایل رو از انتها میخونه و در پشته قرار میده سپس $ رو به ابتدای فایل اضافه میکنه و از استک بقیه کاراکترها رو میخونه و در فایل میریزه. البته نصف اطلاعات رو خراب میکنه و در فایل میریزه!
به نظرتون مشکلش کجاست ؟


.Stack 2048
.Data
filename db 'file3.txt',0
h dw ?
FP dw ?
AXt dw ?
Counter dw ?

.Code
main proc far
mov ax, @data
mov ds, ax
mov es, ax

lea dx, filename
mov ax, 3D02h
int 21h
mov h, ax
jc a

Call Add_Dollar_To_BeginFile

a:
mov ah, 1
int 21h
mov ah, 4ch
int 21h
main endp


Add_Dollar_To_BeginFile Proc near

mov FP, 0
Mov Counter, 0

L1:
xor cx, cx
not cx
add FP, -1
mov dx, FP
mov ax, 4202h
int 21h
cmp ax, 0
je End_Loop

mov ah, 3Fh
mov cx, 1
lea dx, AXt
mov bx, h
int 21h
jc a

push AXt
inc Counter
jmp L1

End_Loop:

mov cx, 0
mov dx, 0
mov ax, 4200h
int 21h

mov AXt, '$'
lea dx, AXt
mov cx, 1
mov bx, h
mov ah, 40h
int 21h

L2:

pop AXt
dec Counter
lea dx, AXt
mov cx, 1
mov bx, h
mov ah, 40h
int 21h
cmp Counter, 0
jne L2

ret
Add_Dollar_To_BeginFile endp

end main

فایل سورس به همراه exe و همچنین فایل متنی رو هم پیوست کردم.

HosseinProgrammer
یک شنبه 30 دی 1386, 12:17 عصر
کسی به نتیجه نرسید ؟؟؟؟؟

Delphi Coder
سه شنبه 02 بهمن 1386, 15:17 عصر
Add_Dollar_To_BeginFile Proc near

mov FP, 0
Mov Counter, 0

L1:
xor cx, cx
not cx
add FP, -1
mov dx, FP
mov ax, 4202h
int 21h
cmp ax, 0
je End_Loop

mov ah, 3Fh
mov cx, 1
lea dx, AXt
mov bx, h
int 21h
jc a
چرا ax رو با صفر مقایسه کردی؟

HosseinProgrammer
دوشنبه 22 بهمن 1386, 20:27 عصر
ax بعد از اینکه اشاره گر فایل رو حرکت بدیم، تعداد بایت ها از ابتدای فایل تا مکان فعلی رو نشون میده. پس هر وقت صفر بشه یعنی به ابتدای فایل رسیده ایم. درسته؟