Я использую MacBook Pro с процессором Intel Core 2 Duo на 2,53 ГГц, но мне сказали, что пользователи Mac должны следовать синтаксису AT&T ( что добавляет мне путаницы, поскольку я использую Intel) и x86 (не уверен, что именно это означает).
Итак, мне нужно приступить к сборке, но мне очень трудно даже начать. Поиск в Интернете показывает код сборки, который сильно различается по синтаксису, и я не могу найти никаких ресурсов, объясняющих основные инструкции по сборке. Я все время читаю о регистрах и стеке, но не понимаю, как на это смотреть. Может ли кто-нибудь объяснить / указать мне правильное направление? Возьмем, к примеру, следующий код, который я нашел работающим:
.data
_mystring: .ascii "Hello World\n\0" #C expects strings to terminate with a 0.
.text
.globl _foo
_foo:
push %ebp
mov %esp,%ebp
pushl $_mystring
call _myprint
add $4,%esp
pop %ebp
ret
Очень простой, но о чем он говорит? Мне сложно понять, как этот код делает то, что он делает. Я знаю Java, PHP и C, среди других языков, но эти шаги и синтаксис мне не понятны. Вот основной файл для него:
#include <stdio.h>
void foo();
void myprint(char *s)
{printf("%s", s);}
main()
{foo();}
Кроме того, есть еще один, который просто умножает числа:
.data
.globl _cntr
_cntr: .long 0
.globl _prod
_prod: .long 0
.globl _x
_x: .long 0
.globl _y
_y: .long 0
.globl _mask
_mask: .long 1
.globl _multiply
multiply:
push %ebp
mov %ebp,%esp
mov $0,%eax
mov _x,%ebx
mov _y,%edx
LOOP:
cmp $0,%ebx
je DONE
mov %ebx,%ecx
and $1,%ecx
cmp $1,%ecx
jne LOOPC
add %edx,%eax
LOOPC:
shr $1,%ebx
shl $1,%edx
jmp LOOP
DONE:
pop %ebp
ret
и файл main.c, связанный с ним:
#include <stdio.h>
extern int multiply();
extern int x, y;
int main()
{
x = 34;
y = 47;
printf("%d * %d = %d\n", x, y, multiply());
}
И, наконец, три небольших вопроса:
В чем разница между именами файлов
.s
и.h
(у меня есть оба файла:main.c
иmain.h
, который для )?И почему для сборки нужен
main.c
/ как это называется?Кто-нибудь может порекомендовать хорошую сборочную среду IDE, такую как Eclipse для Java или PHP
Спасибо всем, кто ответил (на самом деле это моя первая публикация на этом сайте), я пытался понять это в течение нескольких дней, и каждый ресурс, который я прочитал, просто не объясняет мне логику сборки. Там написано, что .data
или .text
понимает, но только тот, кто знает, как «думать, ассемблер», поймет, что они означают?
Кроме того, если кто-то живет в Нью-Йорке и чувствует себя очень комфортно с Assembly и C, я хотел бы получить несколько частных уроков. Я чувствую, что у этого языка есть большой потенциал, и хотел бы выучить его.