developer tip

Mac의 x86 어셈블리

copycodes 2020. 12. 29. 07:20
반응형

Mac의 x86 어셈블리


누구든지 Mac에서 어셈블리를 작성하는 데 좋은 도구 (IDE를 찾고 있습니다)를 알고 있습니까? Xcode는 나에게 약간 번거 롭습니다.

또한 Intel Mac에서 일반 x86 asm을 사용할 수 있습니까? 아니면 수정 된 명령 세트가 있습니까? 인텔 포스트에 대한 모든 정보.

또한 Windows에서 asm은 OS가 만든 에뮬레이트 된 환경에서 실행되어 코드가 자체 전용 컴퓨터에서 실행되고 있다고 생각할 수 있습니다. OS X도 동일한 기능을 제공합니까?


Intel 기반 Mac을 대상으로하는 Xcode 버전을 설치 한 후 어셈블리 코드를 작성할 수 있습니다. Xcode는 도구 모음이며 그 중 하나만 IDE이므로 원하지 않는 경우 사용할 필요가 없습니다. (즉, 만약 당신이 투박하다고 생각하는 특정 사항이 있다면, Apple의 버그 리포터 에게 버그를 제출하십시오 . 모든 버그는 엔지니어링으로 이동합니다.) 또한 Xcode를 설치하면 NASM (Netwide Assembler)과 GNU Assembler (GAS)가 모두 설치됩니다. 가장 익숙한 어셈블리 구문을 사용할 수 있습니다.

Compiler & Debugging Guides 를 살펴볼 수도 있습니다. 여기에는 Mac OS X이 실행되는 다양한 아키텍처에 사용되는 호출 규칙과 바이너리 형식 및 로더가 작동하는 방식이 문서화되어 있기 때문입니다. 특히 IA-32 (x86-32) 호출 규칙은 익숙한 것과 약간 다를 수 있습니다.

명심해야 할 또 다른 점은 Mac OS X의 시스템 호출 인터페이스가 DOS / Windows, Linux 또는 기타 BSD 버전에서 사용하던 인터페이스와 다르다는 것입니다. 시스템 호출은 Mac OS X에서 안정적인 API로 간주되지 않습니다. 대신 항상 libSystem을 사용합니다. 그러면 OS의 한 릴리스에서 다음 릴리스로 이식 가능한 코드를 작성할 수 있습니다.

마지막으로, Mac OS X는 32 비트 코어 싱글부터 하이 엔드 쿼드 코어 제온에 이르기까지 매우 다양한 하드웨어에서 실행됩니다. 어셈블리로 코딩하면 생각만큼 최적화하지 못할 수 있습니다. 한 시스템에서 최적의 것이 다른 시스템에서는 비관적 일 수 있습니다. Apple은 정기적으로 컴파일러를 측정하고 "-Os"최적화 플래그를 사용하여 출력을 조정하여 라인 전체에 적합하며, 수동 조정 된 CPU 특정 구현으로 고성능을 얻는 데 사용할 수있는 광범위한 벡터 / 행렬 처리 라이브러리가 있습니다. .

재미로 조립하는 것은 대단합니다. 속도를 위해 집회에가는 것은 요즘 심장이 약한 사람들을위한 것이 아닙니다.


앞에서 언급했듯이 syscall을 사용하지 마십시오. 표준 C 라이브러리 호출을 사용할 수 있지만 스택은 Apple의 IA32 함수 호출 ABI 당 16 바이트로 정렬되어야 합니다.

스택을 정렬하지 않으면 __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

단계별 x86 Mac 관련 소개는 http://peter.michaux.ca/articles/assembly-hello-world-for-os-x를 참조 하십시오 . 내가 시도한 다른 링크에는 Mac이 아닌 함정이 있습니다.


최근에 Mac OS X에서 Intel x86을 컴파일하는 방법을 배우고 싶었습니다.

nasm의 경우 :

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

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

쉘의 경우 :

./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

For a more verbose explanation, I explained on my Github here:

https://github.com/jaredsburrows/Assembly


Running assembly Code on Mac is just 3 steps away from you. It could be done using XCODE but better is to use NASM Command Line Tool. For My Ease I have already installed Xcode, if you have Xcode installed its good.

But You can do it without XCode as well.

Just Follow:

  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

Simple Text File named myFile.asm is written below for your convenience.

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

Also, on the Intel Macs, can I use generic x86 asm? or is there a modified instruction set? Any information about post Intel Mac assembly helps.

It's the same instruction set; it's the same chips.


The features available to use are dependent on your processor. Apple uses the same Intel stuff as everybody else. So yes, generic x86 should be fine (assuming you're not on a PPC :D).

As far as tools go, I think your best bet is a good text editor that 'understands' assembly.


Forget about finding a IDE to write/run/compile assembler on Mac. But, remember mac is UNIX. See http://asm.sourceforge.net/articles/linasm.html. A decent guide (though short) to running assembler via GCC on Linux. You can mimic this. Macs use Intel chips so you want to look at Intel syntax.


Don't forget that unlike Windows, all Unix based system need to have the source before destination unlike Windows

On Windows its:

mov $source , %destination

but on the Mac its the other way around.

참조 URL : https://stackoverflow.com/questions/5649/x86-assembly-on-a-mac

반응형