انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: فرق syntax زبان اسمبلی در لینوکس و ویندوز چیست؟  (دفعات بازدید: 6809 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین khajavi

  • Sr. Member
  • *
  • ارسال: 361
  • جنسیت : پسر
    • کافه ی گنو/لینوکس

دارم کتاب زبان اسمبلی مزیدی را میخونم رسیدم به جایی که میتونم یک برنامه به زبان اسمبلی بنویسم:

PAGE 60, 132
TITLE ADDS 5 BYTES OF DATA

STSEG SEGMENT
DB 32 DUP ( ? )
STSEG ENDS

DTSEG SEGMENT
DATA_IN DB 25H, 12H, 15H, 2BF, 1FH
SUM DB ?
DTSEG ENDS

CDSEG SEGMENT
MAIN PROC FAR
ASSUME CS: CDSEG, DS: DTSEG, SS: STSEG
MOV AX, DTSEG
MOV DS, AX
MOV CX, 05
MOV OFFSET DATA_IN
MOV AL, 0
AGAIN: ADD AL, [BX]
INC BX
DEC CX
JNZ AGAIN
MOV SUM, AL
MOV AH, 4CL
INT 21H
MAIN ENDP
CDSEG ENDS
END MAN
ولی کامپایل نمیشه.
یه جایی خوندم باید دستوراتم را به SYNTAX AT&T بنویسم اما من خودم برنامه های نمونه ای که به به سینتکس AT&T نبوده را تا به حال با Nasm کامپایل کرده ام.
کلا گیج شده ام.
آیا کسی هست که بتونه کد های بالا را به زبان قابل فهم برای اسمبل کردم با برنامه ی Nasm تبدیل کنه؟

آفلاین yunas

  • Full Member
  • *
  • ارسال: 135
  • جنسیت : پسر
    • دست نوشته های یک عشق کامپیوتر
سلام
خوبی رفیق...
کتاب مزیدی برنامه هاش رو جوری نوشته که قابل کامپایل با نرم افزار masm هستن
شما باید برای نوشتن برنامه هایی که هم توی ویندوز استفاده بشن هم تو لینوکس کاری به وقفه های داس نداشته باشی یا از توابع سیستمی لینوکس استفاده نکنی باید بجای این کارا مستقیما با حافظه و پورت های سخت افزاری کار کنی و برای نوشتن برنامه از nasm استفاده کنی که هر دو جا می تونه برات کامپایل کنه و syntax هم مطابق استاندارد AT&T می باشد...

آفلاین Am1rr3zA

  • Jr. Member
  • *
  • ارسال: 87
  • جنسیت : پسر
  • Dota Lover
یک فرق دیگه هم هست.
اونم اینه که جای  source و dest توی window  و linux  فرق داره!
آدمی پیر چو شد حرص جوان می گردد / خواب در وقت سحرگاه گران می گردد

آفلاین khajavi

  • Sr. Member
  • *
  • ارسال: 361
  • جنسیت : پسر
    • کافه ی گنو/لینوکس
سلام
خوبی رفیق...
کتاب مزیدی برنامه هاش رو جوری نوشته که قابل کامپایل با نرم افزار masm هستن
شما باید برای نوشتن برنامه هایی که هم توی ویندوز استفاده بشن هم تو لینوکس کاری به وقفه های داس نداشته باشی یا از توابع سیستمی لینوکس استفاده نکنی باید بجای این کارا مستقیما با حافظه و پورت های سخت افزاری کار کنی و برای نوشتن برنامه از nasm استفاده کنی که هر دو جا می تونه برات کامپایل کنه و syntax هم مطابق استاندارد AT&T می باشد...
یونس جان اول اینکه چرا وبلاگت را پروندی؟!!!!!!!!!!!
دوما این که من دارم از دو کتاب استفاده می کنم یکی این مزیدی هست و دیگری که توش در مورد لینوکس توضیح هم داده این هست: assembly_language_step_by_step_programming_with_dos_and_linux_with_cd_rom
تو این کتاب یه جا هست که میگه:

نقل‌قول
Therefore, it would make sense to become at least passingly familiar with the AT&T mnemonic set. There are some general rules that, once digested, make it much easier. Here's the list in short form:

    *

      AT&T mnemonics and register names are invariably in lowercase. This is in keeping with the Unix convention of case sensitivity, and at complete variance with the Intel convention of uppercase for assembly language source. I've mixed uppercase and lowercase in the text and examples to get you used to seeing assembly source both ways, but you have to remember that while Intel (and hence NASM) suggests uppercase but will accept lowercase, AT&T requires lowercase.
    *

      Register names are always preceded by the percent symbol, %. That is, what Intel would write as AX or EBX, AT&T would write as %ax and %ebx. This helps the assembler recognize register names.
    *

      Every AT&T machine instruction mnemonic that has operands has a single-character suffix indicating how large its operands are. The suffix letters are b, w, and l, indicating byte (8 bits), word (16 bits), or long (32 bits). What Intel would write as MOV BX,AX, AT&T would write as movw %ax,%bx. (The changed order of %ax and %bx is not an error. See the next rule!)
    *

      In the AT&T syntax, source and destination operands are placed in the opposite order from Intel syntax. That is, what Intel would write as MOV BX,AX, AT&T would write as movw %ax,%bx. In other words, in AT&T syntax, the source operand comes first, followed by the destination. This actually makes a little more sense than Intel conventions, but confusion and errors are inevitable.
    *

      In the AT&T syntax, immediate operands are always preceded by the dollar sign, $. What Intel would write as PUSH DWORD 32, AT&T would write as pushl $32. This helps the assembler recognize immediate operands.
    *

      AT&T documentation refers to "sections" where we would say "segments." A segment override is thus a section override in AT&T parlance. This doesn't come into play much because segments are not a big issue in 32-bit flat model programming. Still, be aware of it.
    *

      Not all Intel instruction mnemonics have AT&T equivalents. JCXZ, JECXZ, LOOP, LOOPZ, LOOPE, LOOPNZ, and LOOPNE do not exist in the AT&T mnemonic set, and gcc never generates code that uses them. This won't be a problem for us, as we're using NASM, but you won't see these instructions in gdb displays.
    *

      In the AT&T syntax, displacements in memory references are signed quantities placed outside parentheses containing the base, index, and scale values. I'll treat this one separately a little later, as you'll see it a lot in .s files and you should be able to understand it.

خوب اگر قرار باشه من حرف این کتاب را گوش بدم باید سینتکس AT&T را بخونم اما یک سوال پس چرا برنامه ی زیر که با سینتکس AT&T نوشته نشده را میشه با nasm کامپایل کرد؟

;  hello.asm  a first program for nasm for Linux, Intel, gcc
;
; assemble: nasm -f elf -l hello.lst  hello.asm
; link: gcc -o hello  hello.o
; run:         hello
; output is: Hello World

SECTION .data ; data section
msg: db "Hello World",10 ; the string to print, 10=cr
len: equ $-msg ; "$" means "here"
; len is a value, not an address

SECTION .text ; code section
        global main ; make label available to linker
main: ; standard  gcc  entry point

mov edx,len ; arg3, length of string to print
mov ecx,msg ; arg2, pointer to string
mov ebx,1 ; arg1, where to write, screen
mov eax,4 ; write sysout command to int 80 hex
int 0x80 ; interrupt 80 hex, call kernel

mov ebx,0 ; exit code, 0=normal
mov eax,1 ; exit command to kernel
int 0x80 ; interrupt 80 hex, call kernel

و یک سوال دیگه این که سینتکس بالا مربوط به چه سینتکسی هست. مطمئنا AT&T که نیست.

آفلاین yunas

  • Full Member
  • *
  • ارسال: 135
  • جنسیت : پسر
    • دست نوشته های یک عشق کامپیوتر
نقل‌قول
یه فرق دیگه هم هست.
اونم اینه که جای  source و dest توی window  و linux  فرق داره!
در این مورد باید گفت که همچنین چیزی وجود نداره و برای دستورات اسمبلی پی سی هیچ تفاوتی نمی کنه که در چه سیستم عاملی نو شته بشه یعنی همه جا دستور mov  des,source به همین صوذت هست اون چیزی که شما می گید در مورد دستورات اسمبلی به فرمت AT&T مربوط به زبان سی هست یعنی اینکه شما می توانید با استفاده از تگ __asm__ دستورات اسمبلی رو در سی بنویسید اینجاست که در سینتکس AT&T می گه دستور mov به این صورت باید باشه:  mov %source,%des این یعنی اینکه جای مبدا و مقصد در این روش عوض شده البته لازم به ذکره که این اصلا ربطی به اسمبلی نداره باید دقت کرد که اسمبلی مجموعه ای از دستورات که برای اسمبلر قابل فهم هستش نه یک زبان برنامه سازی یعنی شما باید در اسمبلی قطعاتتون رو مشخص کنید و بعد دستورات رو در هر قطعه تنطیم کنید.

نقل‌قول
یونس جان اول اینکه چرا وبلاگت را پروندی؟!!!!!!!!!!!
راستش بیشتر بخاطر این بود که فرصت نوشتن توی وبلاگ رو نداشتم...

ببین یه رهنمایی برای یاد گیری اسمبلی از داداشت داشته باش:
اگه می خوای اسمبلی یاد بگیری که همه جا اجرا بشه از اسمبلر nasm استفاده کن و طبق فرمت اون برنامه هات رو بنویس اگه در این مورد مشکلی داشتی بگو تا برات یه راهنما بنویسم...
اسمبلر nasm به نظر من هم راحتره هم اینکه ساختارش با دنیای واقعی شبیه تر البته نسبت به masm مثلا ما توی دنیای واقعی یه قطعه داریم به اسم bss که در masm برای راحتی کار اونو روی قطعه data فرض می کنه ولی در واقع اینجوری نیست و خیلی چیزای دیگه...
مورد بعدی هم اینه که اصلا خودت رو به وقفه های داس عادت نده سعی کن از پورت ها استفاده کنی و در نهایت از وقفه های بایوس مثلا برای خوندن از صفحه کلید از پورت 60h استفاده کن یا برای پاک کردن مانیتور مستقیما حافظه صفحه نمایش رو صفر کن که ادرس اون هست: 0B800h و کارای دیگه ای که می تونی انجام بدی یعنی اینجوری تصور کن که تو اصلا سیستم عاملی نداری که بخوای از توابع اون استفاده کنی و خودت می خوای کارات رو با اسمبلی انجام بدی...
اینجوری بعد از یه مدت می تونی یه سیستم عامل کوچولو برای خودت داشته باشی ( یاد دوران دانشجویی بخیر...)
در نهایت هم برای یاد گیری اسمبلی زیاد عجله نکن چون راه زیادی در پیش هست تا یادم نرفته زیاد خودت رو به کتاب مزیدی عادت نده و بیشتر از اینترنت استفاده کن چون دقیقا مثل این می مونه که بخوای توی دنیایی جدید با دستورات کتاب عهد عتیق زندگی کنی یعنی کتاب مزیدی برای یاد گیری فقط خوبه ولی برنامه های اسمبلی الان با این CPU های قدرتمند اصلا قابل مقایسه با اون برنامه های کتاب مزیدی که برای 8086 نوشته شدن نیستن...

آفلاین khajavi

  • Sr. Member
  • *
  • ارسال: 361
  • جنسیت : پسر
    • کافه ی گنو/لینوکس
از راهنمایی هات ممنون. از همون اول هم میدونستم کتاب مزیدی را باید برای چی بخونم. سعی می کنم آپ تو دیت باشم :دی

حالا من دستورات AT&T را یاد بگیرم یا Intel؟ کدومشون بهترند؟

آفلاین Am1rr3zA

  • Jr. Member
  • *
  • ارسال: 87
  • جنسیت : پسر
  • Dota Lover
از راهنمایی هات ممنون. از همون اول هم میدونستم کتاب مزیدی را باید برای چی بخونم. سعی می کنم آپ تو دیت باشم :دی

حالا من دستورات AT&T را یاد بگیرم یا Intel؟ کدومشون بهترند؟
هرکدوم  که بکارت میاد!
ولی یکیش رو یاد بگیری اون یکی هم انگار یاد گرفتی فرق اساسی زیادی ندارند
آدمی پیر چو شد حرص جوان می گردد / خواب در وقت سحرگاه گران می گردد