Я читаю книгу, где все примеры кода сборки написаны для 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
'int 0x80' не работает на OS/X, как на Linux (системные вызовы разные). Использование Linux-кода в качестве точки stsarting не рекомендуется. Вам действительно нужен учебник по ассемблеру для 32-разрядной Mac OS/X. Одна разумная отправная точка здесь: https://filippo.io/making-system-calls-from-assembly-in-mac-os-x/ –
32 -битный код OS/X будет работать в 64-разрядной ОС/X. Если вы хотите создать по-настоящему 64-битный код OS/X, вам нужно отбросить «int 0x80» и перейти к использованию команды syscall. Это отличается от 'int 0x80'. Вызывающее соглашение отличается, а номера системных вызовов не совпадают с 32-битным кодом OS/X. Вам нужно найти учебник, ориентированный на 64-разрядный код OS/X. Вы также должны использовать '-f macho64' с NASM. –