PDA

View Full Version : كمك براي كامپايل اين كد ساده



moha//\\//\\ad
جمعه 08 اردیبهشت 1391, 05:57 صبح
سلام دوستان ببخشيد كه سوال پيش پا افتاده ميپرسم من يه برنامه هست كه بايد با اسمبلي بنويسم masm 6
رو نصب كردم و براي تست كردن اسمبلر و اينكه حساب كار دستم بياد يه چند تا كد از تو همين انجمن اوردم و هر كدوم يه جورايي ارور داد يكي به فايل هاي سرايند ويژوال سي پلاس پلاس و يكي به ورودي خروجي و يكي به مشخص نبودن اخر فايل خلاصه مجبور شدم از شما كمك بگيرم حالا سوالم اينه كه بدنه يه برنامه اسمبلي چيه فرض كنيد برناه من ميخواد كار زير رو انجام بده حالا من اينو دادم به اسمبلر قبول نكرد پس يعني نياز به تعريف سگمنت و يه سري چيزا داره لذا لطفا بگين من اول و اخر اين كد ساده چي بنويسم تا كار كنه

MOV AX,1

rezaSat_2008
جمعه 08 اردیبهشت 1391, 08:45 صبح
سلام دوست عزیز بهتره اول برای نوشتن کد اسمبلی از برنامه emu 8086 استفاده کنی خود این برنامه مثال هایی هم داره که شما میتونید با اجرا کردن و تریس کردن آنها اگر کمی از اسمبلی بلد باشی چیزی یاد بگیرید
خب این دستور mov که شما در اینجا دادید مقدار 1 را در مبنای 16 در رجیستر ax قرار میدهد همین با debug هم میتونی اینو تست کنی (اینم کامپایل این کد)مقدار ax میشه 001 همین
برای نوشتن کد اسمبلی باید شما مفهوم رجیستر را بدرستی درک کرده باشید و بدانید که هر رجیستر چند بایت میتونی ازش استفاده کنید خلاصه این طور که به نظر میاد شما بهتره اول کتاب مقدماتی اسمبلی را بخونید اگرم بخواهید میتونید از همین سایت مقالاتی در این باره دانلود کنید
برای تکمیل این کد هم خیلی چیزها میتوان نوشت باید دید شما از برنامه چی میخواید فاکتوریال دو عدد یا جمع و تفریق یا نمایش اسمتان و...

موفق باشید دوست عزیز

one hacker alone
جمعه 08 اردیبهشت 1391, 13:35 عصر
كد هاي emu8086 اماده هست و به قول دوستمون مثال هم داره
شما براي اين برنامه بايد سگمنت هارو مشخص كني كه نكردي
من از emu استفاده ميكنم البته كدهاي اون رو نميشه دقيقا روي masm كامپايل كرد

moha//\\//\\ad
جمعه 08 اردیبهشت 1391, 13:57 عصر
ممنون
ببينيد ساده ترين برنامه سي اينه

#include <stdio.h>
main()
{
printf("hi");
}


حالا من ميخوام ساده ترين برنامه كه تو masm جواب ميده رو يكي اينجا بنويسه ساده ساده فقط mov ax,1 بكنه همين
چيزي كه من ميخوام تو emu جواب نميده وگرنه خودم با اون آشنا هستم با دستورات اسمبلي و مباني هم آشنايي دارم تنها چيزي كه ميخوام اينه كه يكي بياد اين برنامه رو به شكلي در بياره كه masm اون رو كامپايل كنه همين

MostafaMohammadi
جمعه 08 اردیبهشت 1391, 17:02 عصر
برای اینکه با Microsoft Macro Assembler بتونی عدد یک رو در ثبات AX قرار بدی، این دو کد ساده ترین کدها هستند:

SSEG SEGMENT STACK
SSEG ENDS
CSEG SEGMENT
START PROC FAR
MOV AX,1
START ENDP
CSEG ENDS
END START
END
یا

SSEG SEGMENT STACK
SSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG
START PROC NEAR
MOV AX,1
START ENDP
CSEG ENDS
END START
END
البته من هر دستوری که توی این برنامه کاربردی نداشته رو حذف کردم و بدنه این برنامه ها یک بدنه کامل نیست، بلکه حداقل های یک بدنه است و این حداقل ها با توجه نوع و ورژن اسمبلری که ازش استفاده می کنید متفاوته.

moha//\\//\\ad
جمعه 08 اردیبهشت 1391, 18:18 عصر
ممنون
ميشه يه توضيحي درباره .686 و .5... و .model ها بدين كه اين ها چي هستن و كجاها استفاده ميشن

بهروز عباسی
جمعه 08 اردیبهشت 1391, 18:24 عصر
http://www.hpkclasses.ir/Courses/Assembly/asm0800.html

moha//\\//\\ad
جمعه 08 اردیبهشت 1391, 23:17 عصر
به زبان ساده خودتون يه توضيح كوتاه بدين ممنون ميشم لينك رو ديدم اما زياد توضيح نداده بود در اين خصوص
روشن نشدم

بهزاد علی محمدزاده
شنبه 09 اردیبهشت 1391, 13:49 عصر
سلام . این قالب و ببین . شما باید در این قالب برنامه تون و بنویسید :



SSEG SEGMENT STACK 'STACK'
DW 100 DUP(?)
SSEG ENDS

DSEG SEGMENT 'DATA'

DSEG ENDS

CODESG SEGMENT 'CODE'
START PROC FAR
ASSUME SS:SSEG,DS:DSEG,CS:CODESG
ORG 100H
MOV AX,DSEG
MOV DS,AX

کد های برنامه

MOV AX,4C00H
INT 21H

START ENDP
CODESG ENDS
END START


مثل این که در تابع main زبان سی برنامه تون و بنویسید .

حالا یه سلام بنویسیم :



SSEG SEGMENT STACK 'STACK'
DW 100 DUP(?)
SSEG ENDS

DSEG SEGMENT 'DATA'
MSG DB 'SALAM','$'
DSEG ENDS

CODESG SEGMENT 'CODE'
START PROC FAR
ASSUME SS:SSEG,DS:DSEG,CS:CODESG
ORG 100H
MOV AX,DSEG
MOV DS,AX

MOV AH,09H
LEA DX,MSG
INT 21H

MOV AX,4C00H
INT 21H

START ENDP
CODESG ENDS
END START

بهزاد علی محمدزاده
شنبه 09 اردیبهشت 1391, 14:23 عصر
حالا یه توضیح درباره سگمنت بندی : اصلا سگمنت بندی چرا ؟ در اسمبلی شما سطح پایین برنامه می نویسید . مثل زبان ها سطح بالا نیست که ما متغیر تعرف کنیم و دیگه کاری نداشته باشیم این کجای حافظه ذخیره میشه . شما در اینجا میگید که فرضا از آدرس 100 به بعد حافظه رو به من اختصاص بده . حالا این سوال پیش میاد که آیا همیشه اون آدرس 100 در دسترس هست ؟ اگر نباشه با برنامه های دیگه تداخل پیدا می کنه ! اینها اومدن سگمنت بندی رو درست کردن که اون خودش میره جایی رو که فضا خالی هست و در نظر می گیره و وقتی شما میگی از آدرس 100 . در واقع از آدرس 100 اون سگمنت داره شروع می کنه و نه آدرس 100 حافظه . حالا ممکنه سگمنت در آدرس 1000 باشه .

این از فلسفه سگمنت بندی . حالا سگمنت stack کارش چیه ؟ اصلا stack کارش چیه ؟ برای نگهداری آدرس پروسیجر ها ( توابع ) و نگهداری پارامتر های برنامه بکار میره . پس یه فضایی رو هم به اون اختصاص میدیم .

متغیر های برنامه رو شما در سگمنت DATA تعریف می کنید . مثل همین سلام .

حالا شما در برنامه آدرس DATA سگمنت رو باید بدین به DS . آدرس در اینجا همون DSEG هست . و در واقع این فقط یه label هست برای برنام نویس و در اصل اینها آدرس هستند .

آدرس و مستقیم نمی تونیم بدیم به DS . یعنی این اشتباهه : MOV DS,DSEG . اینها رو توی روشهای آدرس دهی می تونی بخونی . قبلش این و میریزیم تو ثبات عمومی AX .

کدهای خط شماره 18 و 19 نمونه اول . در واقع میشه گفت معادل دستور exit() زبان سی هست . برای خروج از برنامه . ( و cpu رو به سیستم عامل برگردوند ) .

یه توضیح اگر بخوام بدم در مورد وقفه های . شما فکر کن سطح بالا برنامه می نویسی . یه کلاس داری مثلا به نام Graphic . و متد هایی هم داری که کارهای مختلفی انجام میدن . مثلا متد print یه چیزی رو نمایش بده . line یه چیزی رو رسم کنه و ...

حالا ما وقفه 21 و داریم . یعنی کلاس Graphic . و می خواید متد print رو فراخوانی کنیم . قالبش در اسمبلی اینجوری میشه که شما کد هر متد رو باید بریزی توی AH . قبل از فراخوانی 21H .

مثلا متد exit اگر باشه 4C00 ( اون H به معنای Hex است ) . این و ریخته توی AX . چون 4C در AH و ( H به معنای High ) و 00 هم در AL قرار می گیره . به این دلیل به جای AH از AX استفاده کرده .

ولی برای قسمت نمایش . 09 رو میریزیم توی AH . یعنی تابع print از وقفه 21H .

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

MostafaMohammadi
شنبه 09 اردیبهشت 1391, 20:06 عصر
ممنون
ميشه يه توضيحي درباره .686 و .5... و .model ها بدين كه اين ها چي هستن و كجاها استفاده ميشن
دستور

.MODEL
یک دستور وابسته به کامپایلر است که اندازه برنامه رو تعیین می کنه (Tiny, Small, Large and Huge). اگه شما می خوای دقدغه های تعریف سگمنت رو نداشته باشی می تونی از دستور

.MODEL SMALL
استفاده کنی.
به این تکه کد، از کدی که iAmBehzad عزیز برات گذاشته دقت کن:
SSEG SEGMENT STACK 'STACK'

DW 100 DUP(?)
SSEG ENDS



توی این تکه کد، سگمنت Stack تعریف میشه، درسته؟ برای سادگی کار و کاستن از پیچیدگی های زبان اسمبلی، یک می تونی از مدل SMALL استفاده کنی و بدون توجه به جزئیات اینچنینی کد بنویسی، مثلا برای تعریف سگمنت Stack در مدل SMALL کافیه دستور زیر رو بنویسی:

.STACK [size]

در مورد دستورهای :
.186
.286
.386
.8087
.8086
در صورت نیاز یکی از این دستورها رو در سطور آغازین برنامه می نویسی تا نوع پردازنده رو تعیین کنی، (هر پردازنده ای یک معماری خاصی دارد و زبان ماشین یک معماری با زبان ماشین یک معماری دیگه یکسان نیست) در دانشگاه های ایران معمولا معماری پرکاربرد 80X86 تدریس میشه و به تبع اون کتاب های آموزشی موجود در بازار و مقاله های آموزش زبان اسملی وب فارسی هم برای معماری 80X86 است.

moha//\\//\\ad
شنبه 09 اردیبهشت 1391, 22:24 عصر
ممنون از راهنماييتون
حالا يه سوال
كجاها ما از .model small استفاده ميكنيم و كجا از .model flat,stdcall ؟

MostafaMohammadi
دوشنبه 11 اردیبهشت 1391, 16:26 عصر
دستور

.MODEL FLAT, STDCALL
مدل حافظه برنامه ای که داری می نویسی رو تعیین می کنه و به اسمبلر اطلاع می ده که پارامترها چطور به فانکشن ها پاس داده میشن. (لازم نیست اول کاری ذهن ات رو به اینجور چیزها مشغول کنی.)