ورود

View Full Version : مشکل این کد اسمبلی چیه؟



darknes666
شنبه 21 اردیبهشت 1392, 22:45 عصر
سلام دوستان یک برنامه نوشتم برای ایجاد یک فایل تو درایو H اما کار نمیکنه وقتی رو فایل exe کلیک میکنم فایل به وجود نمیاد میشه کمک کنین و بگین مشکل این کد چیه؟


STACKSG SEGMENT STACK 'STACK'
DW 32H DUP(0)
STACKSG ENDS



DATASG SEGMENT 'DATA'

PATH DB "H:\\HELLO.TXT"
HANDLE DW ?

DATASG ENDS

CODESG SEGMENT 'CODE'

ASSUME SS:STACKSG,DS:DATASG,CS:CODESG

MAIN PROC FAR
MOV DS,AX

mov ax,716Ch ; extended open/create
mov bx,0 ; read-only
mov cx,0 ; normal attribute
mov dx,10H ; open existing file
mov si,OFFSET PATH
int 21h



MOV AX,4C00H
INT 21
MAIN ENDP
CODESG ENDS
END MAIN

m.j_banitaba
دوشنبه 23 اردیبهشت 1392, 13:45 عصر
اینجا (http://asm.inightmare.org/index.php?tutorial=7&location=11) رو ببین


http://asm.inightmare.org/index.php?tutorial=7&location=11

darknes666
دوشنبه 23 اردیبهشت 1392, 21:19 عصر
دوست عزیز مشکلم هنوز حل نشده.
من میخوام یک فایل تو درایو مطلوب مثل G درست بشه.مثلا "hello.txt"
درضمن این برنامه هارو با چی کامپایل کنم.
من از هر نوع کامپایلری بگی استفاده کردم fasm,emu,notepad+tasm+tlink,...
آما بهترینش کدومه؟
و ممنون میشم اگر بتونین در مورد مشکلم راهنماییم کنین.

Delphi Coder
جمعه 27 اردیبهشت 1392, 04:28 صبح
چند تا مساله:
برای چی اولین دستور مقدار AX رو در DS کپی کردید؟ احتمالا اول کار ax صفر هست و این باعث میشه سگمنت داده مقدار صفر بگیره.
اسم فایل باید null terminated باشه یعنی آخرش باید کاراکتر صفر اضافه کنید.
شماره تابع extended open/create باید 6ch باشه یعنی ah=6ch که نوشته مقدار al هم باید صفر باشه اما طبق اون چیزی که شما نوشتی ah=71h هست و al=6ch

Delphi Coder
جمعه 27 اردیبهشت 1392, 04:30 صبح
یه مساله دیگه هم اینکه شما به شیوه زبان C از دو تا \ تو اسم فایل استفاده کردین. باید یکی استفاده بشه.

darknes666
دوشنبه 30 اردیبهشت 1392, 09:35 صبح
سلام دوست عزیز.میشه همه ی این کارایی که گفتی تو کد بنویسی اینجوری من هیچی نفهمیدم.(البته یک کمی فهمیدماااا ).ممنون میشم این کار رو بکنی.

Delphi Coder
چهارشنبه 01 خرداد 1392, 05:05 صبح
علتش این هست که کد رو خودتون ننوشتید یه کد ایراد دار هست که از یه جایی کپی شده تو فروم. ما که نمیتونیم پروژه شما رو انجام بدیم شما بری نمره بگیری اگر کسی کمکی میکنه کمک به یاد گرفتن شما هست نه یاد نگرفتنتون.
شما باید چند قدم عقب تر برگردید. اولین موردی که من نوشتم:
برای چی اولین دستور مقدار AX رو در DS کپی کردید؟ احتمالا اول کار ax صفر هست و این باعث میشه سگمنت داده مقدار صفر بگیره.شما میدونید سگمنت داده یا data segment چی هست و به چه دردی میخوره؟ یا اینکه وقتی آدرس یک متغیر رو (در این مورد مثلا اسم فایل) چجوری میشه به وقفه پاس کرد؟
فکر میکنم نه پس نمیتونید سراغ مرحله بعدی که نوشتن یه برنامه خیلی خیلی ساده به زبان اسمبلی هست برید.

دومین مورد:
اسم فایل باید null terminated باشه یعنی آخرش باید کاراکتر صفر اضافه کنید.آیا میدونید رشته ها رو به چند روش میشه توی برنامه نویسی تعریف کرد؟ مثلا اینکه در C چطوریه و در پاسکال چطوری هست و اینکه وقفه مورد نظر چه نوع رشته ای میگیره؟ ASCIIZ تا حالا به چشمتون خورده؟

سومین مورد:
شماره تابع extended open/create باید 6ch باشه یعنی ah=6ch که نوشته مقدار al هم باید صفر باشه اما طبق اون چیزی که شما نوشتی ah=71h هست و al=6ch این هم مربوط میشه به نحوه استفاده از وقفه ها (در این مورد خصوصا وقفه DOS) در زبان اسمبلی که احتمالا با اون هم آشنایی ندارید.

سرتونو درد نیارم برای کمک به شما مطالب خیلی زیادی باید در اینجا نوشته بشه که فکر میکنم از حوصله هر کسی خارج باشه شما باید این مطالب رو از کتاب مطالعه کنید. یا همین روش خودتون رو برای پیدا کردن کد آماده ادامه بدید که اینجا من فکر نمیکنم در این زمینه کمکتون بکنند.

موفق باشید

darknes666
چهارشنبه 01 خرداد 1392, 09:44 صبح
دوست عزیز اینجوریم که شما میگی نیست.من بازی هایی رو تونسم با اسمبلی هک کنم.ولی این قضیه فرق میکنه.درضمن به C++‎ نسبت به اسمبلی مسلط ترم.حالا این که من نمیتونم فایل درست کنم و این کد کپی هست بله کپی هست از کتاب ایبل ویرایش ششم صفحه ی حدودا 468 من مطالعه ی این کتاب رو مرحله به مرحله انجام نمیدم.چون امسال مشغول یک کار دیگه هستم و سعی میکنم اسمبلی رو محدود یاد بگیرم.پروژه ای هم در کار نیست من به خاطر علاقه به برنامه نویسی رفتم سراغ اسمبلی وگر نه پروژه ندارم.اگر هم میخواین بدونین واسه چی میخوام فایل درست کنم دلیلش اینه که تو ساخت ویروس new folder بهش نیاز دارم.و این که فکر میکنم اسمبلی بهتر هست و الا با C++‎ بلدم اینم کدش:


HANDLE HFILE;
HFILE=CreateFile(L"G:\\hello.txt",GENERIC_READ | GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,NULL,NULL);



حالا اگر کد رو نمیگین حد اقل بگین کدوم فصل ها رو تو ایبل بخونم تا بتونم این کار رو بکنم.خیلی ممنون میشم اگر کمکم کنین.

Delphi Coder
پنج شنبه 02 خرداد 1392, 02:28 صبح
خوب باید توجه داشته باشید برنامه نویسی توی DOS با برنامه نویسی توی ویندوز فرق داره. در DOS شما از سرویسهایی که وقفه های DOS و BIOS در اختیار شما میزاره استفاده میشه ولی توی ویندوز از API استفاده میشه شبیه اون تکه کد C که شما نوشتید. DOS قبلا سیستم عاملی بود که به طور گسترده استفاده میشد ازش(قبل از ویندوز) ولی بعد اینکه ویندوز به بازار اومد DOS شد یه پنجره به اسم Command Prompt که با دستور CMD باز میشه.
بحث در مورد چیزی که گفتید فکر میکنم اینجا ممنوع هست برا همین هم احتمال داره این پستها پاک بشه ولی اگر تونستید این رو بخونید فکر میکنم بهتره با ویندوز و API های اون جلو برید یعنی اگر هم از اسمبلی میخواید استفاده کنید از 32 بیتی که برای ویندوز هست استفاده کنید. masm32