Использование сборки на Mac - PullRequest
7 голосов
/ 21 октября 2011

Я использую 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());
}

И, наконец, три небольших вопроса:

  1. В чем разница между .s и .h именами файлов (у меня есть и main.c и main.h, какое для чего)?

  2. А зачем сборке нужен main.c, чтобы идти с ней / как она называется?

  3. Кто-нибудь может порекомендовать хорошую сборочную IDE, например Eclipse для Java или PHP

Благодаря тому, кто бы ни ответил (это фактически мой первый пост на этом сайте), я пытался выяснить это в течение нескольких дней, и каждый ресурс, который я прочитал, просто не объясняет мне логику сборки. Там написано, что делает .data или .text, но только тот, кто знает, как "думать о сборке", поймет, что они имеют в виду? Кроме того, если кто-то находится в Нью-Йорке и чувствует себя очень комфортно с Ассамблеей и Си, я бы хотел получить несколько частных уроков Я чувствую, что у этого языка большой потенциал, и хотел бы выучить его.

1 Ответ

8 голосов
/ 21 октября 2011

Язык ассемблера - это категория языков программирования, тесно связанных с архитектурой процессора.Традиционно существует взаимно-однозначное соответствие между каждой инструкцией сборки и результирующей инструкцией CPU.

Существуют также ассемблеры псевдоинструкции , которые не соответствуют инструкции CPU, но вместо этоговлияет на ассемблер или сгенерированный код..data и .text являются псевдоинструкциями.

Исторически сложилось так, что каждый производитель ЦП реализовывал язык ассемблера в соответствии со своей ассемблером , утилитой перевода исходного кода.Были определены тысячи определенных языков ассемблера.

В наше время было признано, что каждый язык ассемблера имеет много общих черт, особенно в отношении псевдоинструкций.Коллекция компиляторов GNU (GCC) поддерживает практически каждую архитектуру ЦП, поэтому в ней разработаны общие функции сборки.

x86 относится к семейству Intel 8086 (8088, 8086, 8087, 80186, 80286, 80386, 80486, 80586 aka Pentium, 80686 aka Pentium II и т. Д.)

Синтаксис AT & T - это стиль обозначения, используемый во многих архитектурах ассемблера.Главная особенность заключается в том, что операнды команд записываются в порядке от, до , как это было исторически распространено. Синтаксис Intel использует to, от операндов.Есть и другие различия.

Что касается ваших многочисленных вопросов, вот несколько ресурсов, которые 1) сокрушат вас и 2) в конечном итоге предоставят все ваши ответы:

Обычно вводный класс программирования на ассемблере - это полный семестр с большим количеством практической работы.Предполагается, что вы знакомы с основами компьютерной архитектуры.Разумно ожидать, что понимание вышеупомянутого материала займет 300-500 часов.Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...