سؤال

هل يعرف أحد أي أدوات جيدة (أبحث عن IDEs) لكتابة التجميع على جهاز Mac.Xcode مرهق بعض الشيء بالنسبة لي.

أيضًا، على أجهزة Intel Mac، هل يمكنني استخدام x86 asm العام؟أم أن هناك مجموعة تعليمات معدلة؟أي معلومات حول مشاركة إنتل.

أيضًا:أعلم أنه على نظام التشغيل Windows، يمكن تشغيل asm في بيئة تمت محاكاتها بواسطة نظام التشغيل للسماح للكود بالاعتقاد أنه يعمل على جهاز مخصص خاص به.هل يوفر OS X نفس الشيء؟

هل كانت مفيدة؟

المحلول

بعد تثبيت أي إصدار من Xcode يستهدف أجهزة Mac المستندة إلى Intel، يجب أن تكون قادرًا على كتابة رمز التجميع.Xcode عبارة عن مجموعة من الأدوات، واحدة منها فقط هي IDE، لذا لا يتعين عليك استخدامها إذا كنت لا ترغب في ذلك.(ومع ذلك، إذا كانت هناك أشياء محددة تجدها قديمة، فيرجى الإبلاغ عن خطأ على مراسل علة أبل - كل خطأ يذهب إلى الهندسة.) علاوة على ذلك، سيؤدي تثبيت Xcode إلى تثبيت كل من Netwide Assembler (NASM) وGNU Assembler (GAS)؛سيتيح لك ذلك استخدام أي صيغة تجميعية تناسبك أكثر.

ستحتاج أيضًا إلى إلقاء نظرة على أدلة المترجم والتصحيح, ، لأن هذه الوثائق توثق اصطلاحات الاتصال المستخدمة لمختلف البنيات التي يعمل عليها نظام التشغيل Mac OS X، بالإضافة إلى كيفية عمل التنسيق الثنائي والمحمل.قد تختلف اصطلاحات الاتصال IA-32 (x86-32) على وجه الخصوص قليلاً عما اعتدت عليه.

هناك شيء آخر يجب أخذه في الاعتبار وهو أن واجهة استدعاء النظام في نظام التشغيل Mac OS X تختلف عما قد تكون معتادًا عليه في أنظمة DOS/Windows أو Linux أو إصدارات BSD الأخرى.لا تعتبر مكالمات النظام واجهة برمجة تطبيقات مستقرة على نظام التشغيل Mac OS X؛بدلاً من ذلك، عليك دائمًا المرور عبر libSystem.سيضمن ذلك أنك تكتب تعليمات برمجية قابلة للنقل من إصدار واحد من نظام التشغيل إلى الإصدار التالي.

أخيرًا، ضع في اعتبارك أن نظام التشغيل Mac OS X يعمل عبر مجموعة كبيرة جدًا من الأجهزة - كل شيء بدءًا من Core Single ذو 32 بت وحتى معالج Xeon رباعي النواة المتطور.من خلال البرمجة في التجميع، قد لا تقوم بالتحسين بقدر ما تعتقد؛ما هو الأمثل على جهاز واحد قد يكون متشائمًا على جهاز آخر.تقوم شركة Apple بانتظام بقياس المترجمين الخاصين بها وضبط مخرجاتهم باستخدام علامة التحسين "-Os" لتكون مناسبة عبر خطها، وهناك مكتبات واسعة النطاق لمعالجة المتجهات/المصفوفات يمكنك استخدامها للحصول على أداء عالٍ من خلال تطبيقات خاصة بوحدة المعالجة المركزية (CPU) تم ضبطها يدويًا .

الذهاب إلى التجمع من أجل المتعة أمر رائع.الذهاب إلى التجمع من أجل السرعة ليس لضعاف القلوب هذه الأيام.

نصائح أخرى

كما ذكرنا من قبل، لا تستخدم syscall.يمكنك استخدام استدعاءات مكتبة C القياسية، ولكن كن على علم بأن المكدس يجب أن يكون 16 بايت محاذاة لكل Apple دالة IA32 تستدعي ABI.

إذا لم تقم بمحاذاة المكدس، فسوف يتعطل برنامجك __dyld_misaligned_stack_error عند إجراء مكالمة إلى أي من المكتبات أو الأطر.

يتم تجميع المقتطف التالي وتشغيله على نظامي:

; File: hello.asm
; Build: nasm -f macho hello.asm && gcc -o hello hello.o

SECTION .rodata
hello.msg db 'Hello, World!',0x0a,0x00

SECTION .text

extern _printf ; could also use _puts...
GLOBAL _main

; aligns esp to 16 bytes in preparation for calling a C library function
; arg is number of bytes to pad for function arguments, this should be a multiple of 16
; unless you are using push/pop to load args
%macro clib_prolog 1
    mov ebx, esp        ; remember current esp
    and esp, 0xFFFFFFF0 ; align to next 16 byte boundary (could be zero offset!)
    sub esp, 12         ; skip ahead 12 so we can store original esp
    push ebx            ; store esp (16 bytes aligned again)
    sub esp, %1         ; pad for arguments (make conditional?)
%endmacro

; arg must match most recent call to clib_prolog
%macro clib_epilog 1
    add esp, %1         ; remove arg padding
    pop ebx             ; get original esp
    mov esp, ebx        ; restore
%endmacro

_main:
    ; set up stack frame
    push ebp
    mov ebp, esp
    push ebx

    clib_prolog 16
    mov dword [esp], hello.msg
    call _printf
    ; can make more clib calls here...
    clib_epilog 16

    ; tear down stack frame
    pop ebx
    mov esp, ebp
    pop ebp
    mov eax, 0          ; set return code
    ret

للحصول على مقدمة لطيفة خاصة بنظام التشغيل Mac x86 خطوة بخطوة، راجع http://peter.michaux.ca/articles/assembly-hello-world-for-os-x.تحتوي الروابط الأخرى التي جربتها على بعض المخاطر التي لا تتعلق بنظام التشغيل Mac.

أردت مؤخرًا أن أتعلم كيفية ترجمة Intel x86 على نظام التشغيل Mac OS X:

بالنسبة للنسمة:

-o hello.tmp - outfile
-f macho - specify format
Linux - elf or elf64
Mac OSX - macho

ل د:

-arch i386 - specify architecture (32 bit assembly)
-macosx_version_min 10.6 (Mac OSX - complains about default specification)
-no_pie (Mac OSX - removes ld warning)
-e main - specify main symbol name (Mac OSX - default is start)
-o hello.o - outfile

لشل:

./hello.o - execution

بطانة واحدة:

nasm -o hello.tmp -f macho hello.s && ld -arch i386 -macosx_version_min 10.6 -no_pie -e _main -o hello.o hello.tmp && ./hello.o

اعلمني اذا كان هذا مفيدا لك!

لقد كتبت كيفية القيام بذلك على مدونتي هنا:

http://blog.burrowsapps.com/2013/07/how-to-compile-helloworld-in-intel-x86.html

لمزيد من التوضيح المطول، شرحت على جيثب الخاص بي هنا:

https://github.com/jaredsburrows/Assembly

تشغيل رمز التجميع على جهاز Mac يقع على بعد 3 خطوات فقط منك.يمكن القيام بذلك باستخدام XCODE ولكن الأفضل هو استخدام أداة سطر أوامر NASM.بالنسبة لـ My Ease، لقد قمت بالفعل بتثبيت Xcode، إذا قمت بتثبيت Xcode، فسيكون ذلك جيدًا.

ولكن يمكنك القيام بذلك بدون XCode أيضًا.

فقط اتبع:

  1. قم أولاً بتثبيت NASM باستخدام Homebrew brew install nasm
  2. قم بتحويل ملف .asm إلى ملف Obj باستخدام هذا الأمر nasm -f macho64 myFile.asm
  3. قم بتشغيل Obj File لرؤية OutPut باستخدام الأمر ld -macosx_version_min 10.7.0 -lSystem -o OutPutFile myFile.o && ./64

تم كتابة ملف نصي بسيط اسمه myFile.asm أدناه لراحتك.

global start
section .text

start:
    mov     rax, 0x2000004 ; write
    mov     rdi, 1 ; stdout
    mov     rsi, msg
    mov     rdx, msg.len
    syscall

    mov     rax, 0x2000001 ; exit
    mov     rdi, 0
    syscall

section .data

msg:    db      "Assalam O Alaikum Dear", 10
.len:   equ     $ - msg

أيضًا، على أجهزة Intel Mac، هل يمكنني استخدام x86 asm العام؟أم أن هناك مجموعة تعليمات معدلة؟أي معلومات حول ما بعد تجميع Intel Mac تساعد.

إنها نفس مجموعة التعليمات؛إنها نفس الرقائق.

تعتمد الميزات المتاحة للاستخدام على المعالج الخاص بك.تستخدم Apple نفس عناصر Intel مثل أي شخص آخر.لذا نعم، يجب أن يكون الإصدار x86 العام جيدًا (بافتراض أنك لست على PPC :D).

فيما يتعلق بالأدوات، أعتقد أن أفضل رهان لك هو محرر نصوص جيد "يفهم" التجميع.

انسَ أمر العثور على IDE لكتابة/تشغيل/ترجمة المجمّع على نظام Mac.ولكن، تذكر أن نظام التشغيل Mac هو UNIX.يرى http://asm.sourceforge.net/articles/linasm.html.دليل لائق (رغم أنه قصير) لتشغيل المجمّع عبر مجلس التعاون الخليجي على Linux.يمكنك تقليد هذا.تستخدم أجهزة Mac شرائح Intel لذا تريد إلقاء نظرة على بناء جملة Intel.

لا تنس أنه على عكس Windows، فإن جميع الأنظمة المستندة إلى Unix تحتاج إلى المصدر قبل الوجهة على عكس Windows

على نظام التشغيل Windows الخاص به:

نقل $ المصدر، % الوجهة

ولكن على نظام التشغيل Mac يكون الأمر على العكس من ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top