Да да. Он самый, HELLO WORLD!!!

Итак. Это моя первая программа, написанная на Ассемблере. Точнее сказать скопированная с одного из замечательных сайтов, но я ввёл её сам, сам откомпилировал и скомпоновал. И, о чудо, она заработала. Счастью не было предела. Правда хоть сайт и про Линукс, но делал я её на Маке, т.к. увы и ах, но Debian пока не удалось сюда поставить. Пока что...)

Итак, поехали. Написание простейшей программы выводящей "Hello world!" при помощи системного вызова.

ОС - Mac OS X 10.9.4
синтаксис языка - Intel
компилятор - NASM 0.98.40 (http://www.nasm.us/)
компоновщик - ld64-236.4

Исходный код программы (взято отсюда):

Создаём файл:
user$ touch hello.asm

Открываем его в своём редакторе:
user$ vim hello.asm

Вводим туда саму программу:


    section     .text
    global      _start          ;должна быть объявлена для компоновщика (ld)

    _syscall:
    int     0x80            ;системный вызов
    ret

    _start:                 ;точка входа
    push    dword len   ;длина строки
    push    dword msg   ;строка для вывода
    push    dword 1     ;дескриптор файла (stdout)
    mov     eax,0x4     ;номер системного вызова (sys_write)
    call    _syscall    ;вызываем ядро

    ;альтернативный вариант вызова ядра:
    ;push   eax
    ;call   7:0

    add     esp,12      ;очищаем стек (3 arguments * 4)

    push    dword 0     ;код выхода из программы
    mov     eax,0x1     ;номер системного вызова (sys_exit)
    call    _syscall    ;вызываем ядро

    ;мы не вернёмся из sys_exit,
    ;поэтому нет необходимости очищать стек

    section     .data

    msg     db  "Hello, world!",0xa                 ;наша строка 0xa - \n (перенос строки)
    len     equ $ - msg                             ;длина строки


Компилируем исходный код и получаем объектный файл (указываем формат бинарного файла и получаем объектный файл hello.o):
user$ nasm -f macho hello.asm
(для Линукса указываем формат elf, а не macho)

Запускаем компоновщик для получения исполняемого файла (указываем точку входа, конечное имя исполняемого файла программы и объектный файл):
user$ ld -e _start -o hello hello.o

Если всё нормально, то запускаем программу и наслаждаемся результатом:
user$ ./hello
Hello, world!
user$

На этом пока всё. :)