एक मैक पर x86 असेंबली

मैक पर असेंबली लिखने के लिए किसी को भी किसी भी अच्छे उपकरण (मैं आईडीई की तलाश में हूं) के बारे में जानता हूं। एक्सकोड मेरे लिए थोड़ा बोझिल है।

इसके अलावा, इंटेल मैक पर, क्या मैं सामान्य x86 asm का उपयोग कर सकता हूं? या कोई संशोधित निर्देश सेट है? पोस्ट इंटेल के बारे में कोई जानकारी।

इसके अलावा: मुझे पता है कि विंडोज़ पर, ओएस ओएस द्वारा बनाए गए एक नकली वातावरण में चला सकता है ताकि कोड को लगता है कि यह अपनी समर्पित मशीन पर चल रहा है। क्या ओएस एक्स एक ही चीज़ प्रदान करता है?

0
ro fr bn

9 उत्तर

उपयोग करने के लिए उपलब्ध विशेषताएं आपके प्रोसेसर पर निर्भर हैं। ऐप्पल एक ही इंटेल सामान का उपयोग हर किसी के रूप में करता है। तो हाँ, जेनेरिक x86 ठीक होना चाहिए (मान लीजिए कि आप पीपीसी पर नहीं हैं: डी)।

जहां तक ​​उपकरण जाते हैं, मुझे लगता है कि आपकी सबसे अच्छी शर्त एक अच्छा टेक्स्ट एडिटर है जो 'समझता है' असेंबली।

0
जोड़ा

मैक पर असेंबलर लिखने / चलाने / संकलित करने के लिए आईडीई खोजने के बारे में भूल जाओ। लेकिन, याद रखें मैक यूनिक्स है। http://asm.sourceforge.net/articles/linasm.html देखें। लिनक्स पर जीसीसी के माध्यम से असेंबलर चलाने के लिए एक सभ्य गाइड (हालांकि छोटा)। आप इसकी नकल कर सकते हैं। मैक इंटेल चिप्स का उपयोग करते हैं ताकि आप इंटेल सिंटैक्स को देखना चाहें।

0
जोड़ा

इसके अलावा, इंटेल मैक पर, क्या मैं सामान्य x86 asm का उपयोग कर सकता हूं? या कोई संशोधित निर्देश सेट है? पोस्ट इंटेल मैक असेंबली के बारे में कोई भी जानकारी मदद करता है।

यह वही निर्देश सेट है; यह वही चिप्स है।

0
जोड़ा

हाल ही में मैं सीखना चाहता था कि मैक ओएस एक्स पर इंटेल x86 को कैसे संकलित करना है:

नस्ल के लिए:

-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

एक और verbose स्पष्टीकरण के लिए, मैंने यहां अपने गिथब पर समझाया:

https://github.com/jaredsburrows/Assembly

0
जोड़ा

एक अच्छा चरण-दर-चरण x86 मैक-विशिष्ट परिचय के लिए http देखें : //peter.michaux.ca/articles/assembly-hello-world-for-os-x । मैंने जिन अन्य लिंकों की कोशिश की है, उनमें कुछ गैर-मैक नुकसान हैं।

0
जोड़ा

After installing any version of Xcode targeting Intel-based Macs, you should be able to write assembly code. Xcode is a suite of tools, only one of which is the IDE, so you don't have to use it if you don't want to. (That said, if there are specific things you find clunky, please file a bug at Apple's bug reporter - every bug goes to engineering.) Furthermore, installing Xcode will install both the Netwide Assembler (NASM) and the GNU Assembler (GAS); that will let you use whatever assembly syntax you're most comfortable with.

You'll also want to take a look at the Compiler & Debugging Guides, because those document the calling conventions used for the various architectures that Mac OS X runs on, as well as how the binary format and the loader work. The IA-32 (x86-32) calling conventions in particular may be slightly different from what you're used to.

ध्यान में रखना एक और बात यह है कि मैक ओएस एक्स पर सिस्टम कॉल इंटरफेस जो आप डॉस / विंडोज, लिनक्स, या अन्य बीएसडी स्वादों पर इस्तेमाल किया जा सकता है उससे अलग है। सिस्टम कॉल को मैक ओएस एक्स पर एक स्थिर एपीआई नहीं माना जाता है; इसके बजाय, आप हमेशा libSystem के माध्यम से जाते हैं। यह सुनिश्चित करेगा कि आप कोड लिख रहे हैं जो ओएस की एक रिलीज से अगली तक पोर्टेबल है।

अंत में, ध्यान रखें कि मैक ओएस एक्स हार्डवेयर की एक विस्तृत विस्तृत श्रृंखला में चलता है - 32-बिट कोर सिंगल से सबकुछ हाई-एंड क्वाड-कोर ज़ीऑन के माध्यम से होता है। असेंबली में कोडिंग करके आप जितना सोचते हैं उतना अनुकूलन नहीं कर सकते हैं; एक मशीन पर इष्टतम क्या है दूसरे पर निराशाजनक हो सकता है। ऐप्पल नियमित रूप से अपने कंपाइलर्स को मापता है और अपने आउटपुट को "-ओएस" ऑप्टिमाइज़ेशन फ्लैग के साथ अपनी लाइन में सभ्य होने के लिए धुन देता है, और व्यापक वेक्टर / मैट्रिक्स-प्रोसेसिंग लाइब्रेरीज़ हैं जिनका उपयोग आप हाथ से ट्यून किए गए सीपीयू-विशिष्ट कार्यान्वयन के साथ उच्च प्रदर्शन प्राप्त करने के लिए कर सकते हैं। ।

मज़ा के लिए असेंबली जा रहे हैं महान है। गति के लिए असेंबली में जाना इन दिनों दिल की बेहोशी के लिए नहीं है।

0
जोड़ा
Archive.org संस्करण (इसे कटा हुआ होने से पहले नवीनतम संस्करण) web.archive.org/web/20090622125037/http://developer.apple.co‌ m / & hellip;
जोड़ा लेखक Zimm3r, स्रोत
दो लोगों ने अपने दास को उखाड़ फेंक दिया और शून्य लोगों ने वास्तव में लिंक तय किया ... यह अच्छा होगा अगर ऐप्पल वास्तव में पुराने लेखों को नए लेखों पर रीडायरेक्ट करता था ... मुझे एसओ से जुड़े ऐप्पल दस्तावेज़ों के लिंक मिल गए हैं जो लगभग हमेशा मर चुके हैं ...
जोड़ा लेखक ArtOfWarfare, स्रोत
लिंक अब मान्य नहीं है
जोड़ा लेखक Max MacLeod, स्रोत

जैसा कि पहले बताया गया है, syscall का उपयोग न करें। हालांकि आप मानक सी लाइब्रेरी कॉल का उपयोग कर सकते हैं, लेकिन ध्यान रखें कि स्टैक 16 ऐप्पल प्रति ऐप्पल के IA32 फ़ंक्शन कॉल एबीआई ।

यदि आप स्टैक को संरेखित नहीं करते हैं, तो जब आप किसी भी पुस्तकालय या ढांचे में कॉल करते हैं तो आपका प्रोग्राम __ 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
0
जोड़ा
क्या कोई मुझे बता सकता है कि इस उदाहरण को "nasm -f macho hello.asm && gcc -arch i386 -e _main -lSystem -o हैलो हैलो.ओ && ./hello" के साथ क्यों चल रहा है "बस त्रुटि: 10" के अंत में उत्पादन?
जोड़ा लेखक Colin, स्रोत
यह पता चला: मुझे लगता है कि एक बग था। तर्क के लिए पैड के लिए clib_prolog का अंत उप% 1 बाइट होना चाहिए, और clib_epilog को% 1 बाइट जोड़ना चाहिए। मैंने इसे प्रतिबिंबित करने के लिए उत्तर संपादित किया।
जोड़ा लेखक Colin, स्रोत
आपका लिंक मर चुका है क्या आप इसे अपडेट कर सकते हैं?
जोड़ा लेखक th3v0id, स्रोत

यह मत भूलना कि विंडोज के विपरीत, सभी यूनिक्स आधारित सिस्टम को विंडोज के विपरीत गंतव्य से पहले स्रोत होना चाहिए

विंडोज़ पर:

mov $ स्रोत,% गंतव्य

लेकिन मैक पर इसके आसपास दूसरी तरफ।

0
जोड़ा
यदि आप मैक पर कुछ डिस्सेम्बल कोड पढ़ रहे हैं, और एक गाइड के रूप में एक सामान्य ऑनलाइन x86 asm संदर्भ का उपयोग कर रहे हैं, तो इस बिंदु से अवगत होना उपयोगी है।
जोड़ा लेखक Colin, स्रोत

मैक पर असेंबली कोड चलाना आपके से सिर्फ 3 कदम दूर है। यह एक्ससीडीईई का उपयोग करके किया जा सकता है लेकिन NASM कमांड लाइन टूल का उपयोग करना बेहतर है। मेरी आसानी के लिए मैंने पहले ही एक्सकोड स्थापित किया है, अगर आपके पास एक्सकोड स्थापित है तो यह अच्छा है।

लेकिन आप एक्सकोड के बिना भी ऐसा कर सकते हैं।

बस पालन करें:

  1. First Install NASM using Homebrew brew install nasm
  2. convert .asm file into Obj File using this command nasm -f macho64 myFile.asm
  3. Run Obj File to see OutPut using command 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
0
जोड़ा