Montaje x86 en un Mac
Pregunta
¿Alguien sabe de algún buen herramientas (estoy buscando IDEs) para escribir la asamblea en el Mac.Xcode es un poco incómodo para mí.
También, en los Macs Intel, puedo utilizar el genérico asm x86?O es que hay una modificación del conjunto de instrucciones?Cualquier información acerca de los post de Intel.
También:Sé que en windows, asm se puede ejecutar en un emulador de medio ambiente creado por el sistema operativo para permitir que el código de pensar es que se ejecuta en su propia máquina dedicada.¿OS X proporcionar la misma cosa?
Solución
Después de instalar cualquier versión de Xcode orientación de equipos Mac basados en Intel, usted debería ser capaz de escribir código de ensamblado.Xcode es un conjunto de herramientas, de las cuales sólo una es la IDE, así que usted no tiene que usarlo si no quieres.(Dicho esto, si hay cosas específicas que usted encuentre torpe, por favor envíe un reporte en Apple bug reporter - cada error va a la ingeniería.) Además, la instalación de Xcode va a instalar el Netwide Assembler (NASM) y el GNU Assembler (GAS);que te permitirá utilizar cualquier asamblea de la sintaxis que se sienten más cómodos.
Usted también querrá echar un vistazo a la Compilador & Depuración De Guías, debido a que esos documentos las convenciones de llamada utilizadas para las distintas arquitecturas que Mac OS X se ejecuta en, así como el formato binario y el cargador de trabajo.IA-32 (x86-32), llamando a los convenios, en particular, pueden ser ligeramente diferentes de lo que estamos acostumbrados.
Otra cosa a tener en cuenta es que el sistema de llamada de la interfaz de Mac OS X es diferente de lo que podría ser utilizado en DOS/Windows, Linux o BSD sabores.Sistema de llamadas no se considera una API estable en Mac OS X;en su lugar, usted siempre ir a través de libSystem.Que se asegurará de que usted está escribiendo código que se portátil de una versión del sistema operativo para el siguiente.
Por último, tenga en cuenta que Mac OS X se ejecuta a través de una muy amplia gama de hardware de todo tipo, desde los de 32 bits Core Solo a través de la gama alta de procesadores quad-core Xeon.Mediante la codificación en la asamblea no puede ser la optimización tanto como piensas;lo óptimo en una máquina, puede ser pessimal en otro.Apple regularmente las medidas de sus compiladores y las melodías de su salida con el "-Os" optimización de la bandera decente a través de su línea, y existe un gran vector/matriz de procesamiento de bibliotecas que usted puede utilizar para obtener un alto rendimiento con una mano-afinado de la CPU implementaciones específicas.
Ir a la asamblea para su diversión es grande.Ir a la asamblea para que la velocidad no es para los débiles de corazón en estos días.
Otros consejos
Como se dijo antes, no utilizar syscall.Usted puede utilizar el estándar de C biblioteca de llamadas, pero ser conscientes de que la pila DEBE ser de 16 bytes alineado por Apple IA32 llamada a la función ABI.
Si no alinee la pila, el programa se bloqueará en __dyld_misaligned_stack_error
cuando se realiza una llamada en cualquiera de las bibliotecas o de los marcos.
El siguiente fragmento de código se compila y se ejecuta en el sistema:
; 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
Para un buen paso-por-paso x86 Mac específica de la introducción de ver http://peter.michaux.ca/articles/assembly-hello-world-for-os-x.Los otros enlaces que he tratado de tener algún no-Mac trampas.
Recientemente he querido aprender a compilar Intel x86 en Mac OS X:
Para nasm:
-o hello.tmp - outfile
-f macho - specify format
Linux - elf or elf64
Mac OSX - macho
Para el 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
Para El 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
Déjame saber si esto ayuda!
Escribí cómo hacerlo en mi blog aquí:
http://blog.burrowsapps.com/2013/07/how-to-compile-helloworld-in-intel-x86.html
Para una más detallada explicación, expliqué en mi Github aquí:
Ejecución de Código ensamblador en Mac es sólo 3 pasos de distancia de usted.Se puede hacer uso de XCODE, pero mejor es utilizar NASM Herramienta de Línea de Comandos.Para Mi Facilidad ya he instalado Xcode, si usted tiene Xcode instalado bien.
Pero se puede hacer sin XCode así.
Simplemente Sigue:
- Primero Instalar NASM el uso de Homebrew
brew install nasm
- convertir .asm archivo en el Archivo Obj usando este comando
nasm -f macho64 myFile.asm
- Ejecutar el Archivo Obj ver la Salida usando el comando
ld -macosx_version_min 10.7.0 -lSystem -o OutPutFile myFile.o && ./64
Simple Archivo de Texto denominado miarchivo.asm se escribe a continuación para su conveniencia.
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
También, en los Macs Intel, puedo utilizar el genérico asm x86?o es que hay una modificación del conjunto de instrucciones?Cualquier información acerca de los post de Mac Intel asamblea de la ayuda.
Es el mismo conjunto de instrucciones;es el mismo chips.
Las características disponibles para su uso depende de tu procesador.Apple utiliza el mismo Intel cosas como todos los demás.Así que sí, x86 genérico debe estar bien (suponiendo que no estás en un PPC :D).
Tan lejos como herramientas de ir, creo que tu mejor apuesta es un buen editor de texto que "entiende" de la asamblea.
Olvídate de encontrar un IDE para escribir/ejecutar/compilación de ensamblador en Mac.Pero recuerde que una mac es UNIX.Ver http://asm.sourceforge.net/articles/linasm.html.Un decente guía (aunque corto) a la ejecución de ensamblador a través de GCC en Linux.Puede imitar este.Macs uso de los chips de Intel por lo que desea buscar en la sintaxis de Intel.
No olvides que a diferencia de Windows, todos basados en Unix es necesario que el sistema tenga la fuente antes de destino, a diferencia de Windows
En Windows es:
mov $fuente , %destino
pero en el Mac es al revés.