Ассемблер в Linux: первый HAX!

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ku6o, 1 Feb 2015.

  1. ku6o

    ku6o New Member

    Joined:
    2 Dec 2013
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    GNU assembler - читать всем кто хоть раз хотел это попробовать!

    файл: kog.S
    Code:
    .globl _start
    .data
    HAX: .ascii "HAX!\n";
    .text
    _start: .func
    movq $5,%rdx /* gJLuHa cmpoku */
    lea HAX,%rsi /* agpec HAX */
    movq $1,%rdi /* stdout */
    movq $1,%rax /* write */
    syscall
    
    movq %rax,%rdi /* 3anucaHo B stdout */
    movq $60,%rax /* exit */
    syscall
    .endfunc
    кодировка, сборка, запуск и вывод кода выхода проги.
    as -o ./kog.o ./kog.S && ld -o ./cmapm ./kog.o && ./cmapm ; echo Ha Bblxoge: $?

    О том как соблюдать синтаксис читайте в info gas.

    Чего нет в инфо:
    1) Символ _start является точкой входа програмы. При привращении объектов в эльф, ld ищет именно этот символ( попробуйте заменить на main ).
    2) Порядок передачи аргументов в функцию для архитектуры x86_64: rdi,rsi,rdx,r10,r8,r9.
    3) В rax передаётся номер системного вызова; список с номерами находится в фаиле /usr/include/x86_64-linux-gnu/asm/unistd_64.h
    4) .globl function аналог extern void function();

    Как из Си вызвать асм.
    фаил: main.c
    Code:
    extern int kog(const char *str, int n);
    extern int main(int argc, char *argv[], char *envp[]){ 
    char* HAX="HAX!\n";
    int ret; ret=kog(HAX,5);
    return(ret);}
    фаил: kog.S
    Code:
    .globl kog
    .text
    kog: .func
    movq %rsi,%rdx
    movq %rdi,%rsi
    movq $0x01,%rdi
    movq $0x01,%rax
    syscall
    movq $111,%rax
    retq
    .endfunc
    преобразование, запуск и результат.
    gcc -o ./cmapm main.c kog.S && ./cmapm ; echo Ha Bblxoge: $?

    P.S. Непонимаю почему в доках, когда хотят рассказать про ассемблер в *nix, говорят: "Есть gas и он уже в системе, но програмить будем на nasm. Ставим nasm." и дальше как ставить nasm;( Вспомнил девелоперский хэндбук к freebsd ).
     
  2. herfleisch

    herfleisch Elder - Старейшина

    Joined:
    7 Jan 2009
    Messages:
    579
    Likes Received:
    203
    Reputations:
    13
    Спешу огорчить, но первым на ачате в этой теме был я, еще несколько лет тому назад: https://forum.antichat.ru/nextoldesttothread125161.html .

    Го кодить для FreeBSD, есть интересная задача.
     
  3. wapxmas

    wapxmas New Member

    Joined:
    25 Nov 2013
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0