x86 Asamblare pe un Mac

Stie cineva despre orice instrumente bune (caut IDE-uri) pentru a scrie ansamblu pe Mac. Xcode-ul este cam greoi pentru mine.

De asemenea, pe Mac-urile Intel, pot folosi generic x86 asm? Sau există un set de instrucțiuni modificat? Orice informații despre postul Intel.

De asemenea, știu că pe Windows, ASM poate rula într-un mediu emulat creat de sistemul de operare pentru a lăsa codul să creadă că funcționează pe mașina proprie dedicată. Are OS X același lucru?

0
fr hi bn

9 răspunsuri

Funcțiile disponibile pentru utilizare depind de procesor. Apple utilizează aceleași lucruri Intel ca și ceilalți. Deci da, generic x86 ar trebui să fie bine (presupunând că nu sunteți pe un PPC: D).

În ceea ce privește instrumentele, cred că cel mai bun pariu este un editor de text bun care înțelege asamblarea.

0
adăugat

Uitați de găsirea unui IDE pentru scrierea / executarea / compilarea asamblorilor pe Mac. Dar, rețineți că mac este UNIX. Consultați http://asm.sourceforge.net/articles/linasm.html . Un ghid decent (deși scurt) pentru a rula asamblorul prin GCC pe Linux. Puteți imita acest lucru. Mac-urile folosesc chips-uri Intel pentru a vă uita la sintaxa Intel.

0
adăugat

De asemenea, pe Mac-urile Intel, pot folosi generic x86 ASM? sau există un set de instrucțiuni modificat? Orice informație despre asamblarea Post Intel Mac ajută.

Este același set de instrucțiuni; sunt aceleași jetoane.

0
adăugat

Recent am vrut să învăț cum să compilez Intel x86 pe Mac OS X:

Pentru nasm:

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

Pentru ld:

-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

Pentru Shell:

./hello.o - execution

One-liner:

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

Dați-mi voie să știu dacă acest lucru vă ajută!

Am scris cum să fac acest lucru pe blogul meu aici:

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

Pentru o explicație mai amănunțită, i-am explicat pe Github-ul meu aici:

https://github.com/jaredsburrows/Assembly

0
adăugat

Pentru o prezentare detaliată pe x86 pas-cu-pas, consultați http : //peter.michaux.ca/articles/assembly-hello-world-for-os-x . Celelalte linkuri pe care le-am încercat au unele capcane non-Mac.

0
adăugat

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.

Un alt lucru care trebuie păstrat în minte este faptul că interfața de apelare a sistemului pe Mac OS X este diferită de cea pe care s-ar putea să o utilizați pe DOS / Windows, Linux sau alte arome BSD. Apelurile de sistem nu sunt considerate ca API stabil pe Mac OS X; în schimb, întotdeauna treceți prin libSystem. Acest lucru vă va asigura că scrieți un cod care este portabil de la o versiune a sistemului de operare la alta.

În cele din urmă, rețineți că Mac OS X rulează pe o gamă destul de largă de hardware - totul de la Core Single Single pe 32 de biți prin Xeon quad-core high-end. Prin codarea în ansamblu, este posibil să nu optimizați atât de mult cât credeți; ceea ce este optim pe o singură mașină poate fi pessimal pe altul. Apple își măsoară în mod regulat compilatorii și își evaluează producția cu steagul de optimizare "-Os" pentru a fi decent pe toată linia sa și există biblioteci extinse de procesare vectorială / matrice pe care le puteți utiliza pentru a obține performanțe ridicate cu implementări specifice CPU-urilor .

A merge la ansamblu pentru a te distra este grozav. A merge la ansamblu pentru viteză nu este pentru cei slabi de inimă în aceste zile.

0
adăugat
Versiunea Archive.org (cea mai recentă versiune înainte de a fi tăiată) web.archive.org/web/20090622125037/http://developer.apple.co‌ m / & hellip;
adăugat autor Zimm3r, sursa
Două persoane și-au învins sass-ul, iar oamenii de la zero au fixat link-ul ... ar fi drăguț ca Apple să aibă vechi link-uri redirecționate la articole noi ... Am găsit link-uri către documentele Apple legate de SO sunt aproape întotdeauna moarte ...
adăugat autor ArtOfWarfare, sursa
Linkul nu mai este valabil
adăugat autor Max MacLeod, sursa

Așa cum am spus mai devreme, nu folosiți sistemul de sincronizare. Cu toate acestea, puteți utiliza convorbirile standard din biblioteca C, dar trebuie să fiți conștient de faptul că stackul TREBUIE să fie aliniat la 16 octeți pe Apelarea funcției IA32 ABI .

Dacă nu aliniați stiva, atunci când efectuați un apel în oricare dintre biblioteci sau cadre, programul dvs. se va prăbuși în __ dyld_misaligned_stack_error .

Următorul fragment se asamblează și rulează pe sistemul meu:

; 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
adăugat
Poate cineva să-mi spună de ce rulați acest exemplu cu "nasm -f macho hello.asm && gcc -arch i386 -e _main -lSystem -o hello hello.o && ./hello" dă "eroare bus: 10" la sfârșitul ieșire?
adăugat autor Colin, sursa
Am crezut că a existat un bug. Sfârșitul lui clib_prolog ar trebui să fie sub% 1 octeți, în scopul de a introduce argumentele, iar clib_epilog ar trebui să adauge% 1 octeți. Am editat răspunsul pentru a reflecta acest lucru.
adăugat autor Colin, sursa
Linkul dvs. este mort. L-ai putea actualiza?
adăugat autor th3v0id, sursa

Nu uitați că, spre deosebire de Windows, tot sistemul bazat pe Unix trebuie să aibă sursa înainte de destinație spre deosebire de Windows

Pe Windows:

mov $ source,% destination

dar pe Mac este invers.

0
adăugat
Dacă citiți un cod dezasamblat pe un Mac și utilizând un ghid tipic online x86 asm, este util să fiți conștient de acest punct.
adăugat autor Colin, sursa

Codul de asamblare Running on Mac este la doar 3 pași distanță de dvs. S-ar putea face folosind XCODE, dar este mai bine să utilizați instrumentul de comandă NASM. Pentru My Ease am instalat deja Xcode, dacă ai instalat Xcode bine.

Dar puteți să o faceți fără XCode.

Doar urmareste:

  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

Fișierul text simplu numit myFile.asm este scris mai jos pentru confortul dvs.

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
adăugat