PDA

View Full Version : کامپایلر خوب معرفی می کنید !؟



amiri27
شنبه 21 بهمن 1385, 15:25 عصر
سلام
کسی می تونه کمک کنه و یک کامپایلر خوب برای این اجرا کردن این برنامه به ما معرفی کنه!
ما می خوایم دستورات اسمبلی که در این برنامه c نوشتیم رو اجرا کنیم اما تا حالا تمام کامپایلر های c دستور asm رو نشناختند یعنی باهاش مشکل داشتند.
برای ما اجرای دستورات اسمبلی مهمه. یعنی اگر یک اسمبلر خوب هم معرفی کنید کافی هستش اما اگر compiler برای c که کامل باشه هم بگید دیگه چه بهتر.
فقط لطفا لینکش رو بفرستید که از کجا دانلود کنیم.

#include<stdio.h>
#include<conio.h>
#include <dos.h>
void main()
{
asm {push dx;
dx,0x308;
mov al,1
mov dx,al;
}
sleep(1);
asm { mov al,2
mov dx,al;
}
sleep(1);
asm{ mov al,4
mov dx,al;
}
sleep(1);
asm{ mov al,8
mov dx,al;
}
}


اصلا کسی می تونه کامپایل شده اون رو به ما بده !؟؟
ممنون
با تشکر

american_iran2006
شنبه 21 بهمن 1385, 19:08 عصر
سلام دوست من

شما برای اینکه بتونی تو c اسمبلی بنویسی باید اینجوری

{}asm_ بنویسی

نه

{}asm
من برای کامپایل c از win32 استفاده می کنم

برات هم این برنامه رو کامپال کردم

american_iran2006
شنبه 21 بهمن 1385, 21:31 عصر
راستی اینم بگم که

هر موقع که تابع main از نوع void بود باید اخره تابع بنویسی return;

oVERfLOW
شنبه 21 بهمن 1385, 23:43 عصر
اسمبلرهای موجود
masm32
tasm32
fasm
nasm
lzasm
Genesys

بهترینش Masm32 و Genesys هستن که در حقیقت همون اسمبلر مایکروسافت
هست
Genesys نسخه‌اش جدیدتره

user addi
یک شنبه 22 بهمن 1385, 17:31 عصر
نه احتیاجی به نوشتن {}asm_ نیست. همون {}asm هم جواب می ده فقط باید آکولاد بازش رو حتما جلوی خود }asm بنویسی..
من نزدیک 3000 خط اسمبلی رو با این روش تو tcdos نوشتم و هیچ مشکلی هم نداره ...
برنامه شما چند تا مشکل دستوری داره :
1_ تو اسمبلی نباید از 0x برای نوشتن hex استفاده کنید 0x306 => 306h

2_ نوع رجیستر ها رو درست انتخاب کن هیچ وقت نمی تونی al رو تو dx بریزی

این ها رو که درست کنی برنامت درست می شه

american_iran2006
دوشنبه 23 بهمن 1385, 00:40 صبح
:متعجب: این که میگید لازم نیست یعنی چی

همین کدی که دوستمون نوشتن از همین روشه که شما می گید .. اما تو کامپال

کامپایلر c کلی error می گیره

اما بد از نو شتن asm_

به سادگی کامپایل میشه

شما تو کدوم محیط میگید نیازی نیست

user addi
دوشنبه 23 بهمن 1385, 01:09 صبح
بله همون کد رو میگم.
مشکل این برنامه تو گذاشتن asm_ یا asm خالی نیست بلکه این برنامه از لحاظ دستوری اشتباه است و ایراد های توی سی هم به خاطر اینه که یک رجیستر 8 بیتی ( al ) رو می خواد تو یک رجیستر 16بیتی (dx ) بریزه که از لحاظ مفهومی و دستوری اشتباهه..

amiri27
دوشنبه 23 بهمن 1385, 12:15 عصر
سلام
دستتون درد نکنه!
حالا تست می کنم بازم سوال داشتم می پرسم.
مرسی!

amiri27
سه شنبه 24 بهمن 1385, 20:16 عصر
سلام
آقا میشه اینم کامپایل کنید.
البته من خودم الان دیگه با ویژوال سی ++ می تونم کامپایل کنم اما شما بچه های اینجا استادید!
میشه ببینید یه موقع عیب هم نداشته باشه!؟؟

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
__asm {
label1: push dx
mov dx,300
in bl,dx
nop
nop
nop
nop
pop dx

mov al,38h
call COMMWRT
call DELAY
mov al,OEh
call DELAY

mov al,01
call COMMWRT

mov al,06h
call COMMWRT
call DELAY

mov al,83h
call COMMWRT
call DELAY

mov al,43h
call DATAWRT
call DELAY

mov al,6Fh
call DATAWRT
call DELAY

mov al,75h
call DATAWRT
call DELAY

mov al,6Eh
call DATAWRT
call DELAY

mov al,74h
call DATAWRT
call DELAY

mov al,3Ah
call DATAWRT
call DELAY


mov al,3Ah
call DATAWRT
call DELAY

mov al,20h
call DATAWRT
call DELAY

mov al,bl
call DATAWRT
call DELAY


COMMWRT proc
push dx
mov dx,302
out dx,al

nop
nop
nop
nop

mov al,00000000b
; rs,r/w,e all is 0

out dx,al
pop dx
ret2
COMMWRT endp

DATAWRT PROC
push dx
mov dx, 301h
out dx,al
mov al,00000101b

; rs,e is 1 & r/w is 0

mov dx,302h
out dx,al

nop
nop
nop
nop

mov al, 00000001b
; change e from 1 to 0

out dx,al
pop dx
ret
DATAWRT endp

jp label1
DELAY proc
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
DELAY endp
}
return 0;
}

ببینید این برنامه مربوط به مداری میشه که یک داده 8 بیتی رو از آدرس 300 هگز می خونه و اون رو به آدرس 301 و 302 که lcd هستش می فرسته!
این مدار از طریق اسلات isa به کامپیوتر وصل می شه.
روی lcd هم اینجور نمایشی باید داشته باشیم:
Count: XX
که XX همون عددی هستش که از ادرس 300 میخونه و اون رو روی رجیستر bl ذخیره کردم.
راستی bl رجیستر 16 بیتی هستش اما مگه ما نمی تونیم از 8 بیت پایین مرتبه استفاده کتیم و کاری به 8 تای بالا نداشته باشیم.
بچه ها اگر کسی تا حالا نمونه این کار رو کرده هم می تونه کمکم کنه!؟؟


ممنون زیاد!!!