2016-04-14 4 views
2

Я читаю книгу, где все примеры кода сборки написаны для 32-разрядной Linux-среды, и я использую 64-разрядный Mac. Я смог скомпилировать следующую программу с NASM после изменения _start до start. Однако, когда я запускаю исполняемый файл, он не печатает hello world, как я ожидал. Есть ли возможность перейти на NASM, чтобы скомпилировать его таким образом, который будет работать на 64-битном Mac?Используйте NASM для компиляции 32-разрядной сборки для среды x86_64

Я пробовал:

nasm -f macho32 helloworld.asm 

и

nasm -f macho helloworld.asm 

следуют:

ld helloworld.o -o helloworld 

Мой код:

section .data  ; data segment 
msg  db  "Hello, world!", 0x0a ; the string and newline char 

section .text  ; text segment 
global start  ; Default entry point for ELF linking 

start: 
    ; SYSCALL: write(1, msg, 14) 
    mov eax, 4  ; put 4 into eax, since write is syscall #4 
    mov ebx, 1  ; put 1 into ebx, since stdout is 1 
    mov ecx, msg  ; put the address of the string into ecx 
    mov edx, 14  ; put 14 into edx, since our string is 14 bytes 
    int 0x80   ; Call the kernel to make the system call happen 

    ; SYSCALL: exit(0) 
    mov eax, 1  ; put 1 into eax, since exit is syscall #1 
    mov ebx, 0  ; exit with success 
    int 0x80   ; do the syscall 
+1

'int 0x80' не работает на OS/X, как на Linux (системные вызовы разные). Использование Linux-кода в качестве точки stsarting не рекомендуется. Вам действительно нужен учебник по ассемблеру для 32-разрядной Mac OS/X. Одна разумная отправная точка здесь: https://filippo.io/making-system-calls-from-assembly-in-mac-os-x/ –

+1

32 -битный код OS/X будет работать в 64-разрядной ОС/X. Если вы хотите создать по-настоящему 64-битный код OS/X, вам нужно отбросить «int 0x80» и перейти к использованию команды syscall. Это отличается от 'int 0x80'. Вызывающее соглашение отличается, а номера системных вызовов не совпадают с 32-битным кодом OS/X. Вам нужно найти учебник, ориентированный на 64-разрядный код OS/X. Вы также должны использовать '-f ​​macho64' с NASM. –

ответ

2

Просто так не будет работать. Получите виртуальную машину и установите 32-разрядный Linux в VM. Проблема не в использовании x86_32 кода на x64. Проблема заключается в попытке запустить syscall Linux на MAC. Нет оснований полагать, что это сработает.

Смежные вопросы