Я вернулся - благодаря добрым людям здесь, особенно @Jester и @PeterCordes, у меня есть три из четырех моих целевых платформ. У меня Win 32 и Win 64 работают, и у меня OS X 64 работает, но я не могу заставить работать сборку OS X в 32-битной библиотеке libc.os x 32-bit printf от ассемблера
Я могу сделать «мир привет» и другие вещи, используя syscall (64-разрядный) и int 0x80 (32-разрядный), и я могу сделать работу _printf в 64-битной, но мне не удаётся сделать он работает в 32-битном режиме.
В теории мне нужно нажать параметры в стек, а затем по 16 байт выровнять стек, но я получаю ошибку сегментации: 11 ошибка при запуске кода.
8 section .data
9
10 hello db "Hello, world", 0x0a, 0x00
11
12 section .text
13
14 global _main
15 extern _printf, _exit
16
17 _main:
18 push hello
19 sub esp, 12 ; 16-byte align stack
20 call _printf
21
22 add esp, 16 ; undo stack alignment
23 push 0
24 sub esp, 12 ; 16-byte align stack
25 call _exit
Я пробовал его без кода выравнивания стека, и я получаю ту же ошибку. Я нашел различные образцы онлайн, и я не мог заставить их работать, и я даже сделал трюк с использованием GCC для вывода ассемблера Intel-синтаксиса, и я не смог перевести его в nasm.
Я использую nasm, потому что он работает на Windows, OS X и Linux, поэтому мне нужно только изучить один синтаксис ассемблера.
Я понимаю, что все компьютеры Intel 64-разрядные, но они могут запускать 32-разрядный код, поэтому я хочу быть в состоянии следить за ним и понимать его. Все это направлено на то, чтобы помочь мне перепрограммировать вредоносное ПО.
Благодарность
у Вас возникли проблемы перевода 'Gcc -masm = intel' выхода в NASM? Это странно; это очень похоже на MASM, так что это в основном то же самое, за исключением того, что вместо DWORD они записывают 'DWORD PTR'. Вы всегда можете просто использовать дизассемблер, который выводит правильный синтаксис nasm, например. Превосходный дизассемблер «objconv» Агнера Фога. –