Описание подпрограммы (assembler)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Кубик Рубик, 13 Dec 2009.

  1. Кубик Рубик

    Joined:
    10 Apr 2008
    Messages:
    48
    Likes Received:
    0
    Reputations:
    0
    strcat - добавляет копию строки, указанной как src к
    концу строки, указанной как dest, заменяя при этом
    последний знак строки dest первым знаком строки
    src.


    помогите разобрать каждую строчку.)))) и почему мы выделяем где-то 12 памяти, где-то 16 и тп

    .intel_syntax noprefix
    .globl my_strcat
    .type my_strcat, @function
    my_strcat:
    push ecx
    push edx
    mov edx, [esp+12]
    find_end:
    mov al, BYTE PTR [edx]
    inc edx
    cmp al, 0
    inc find_end
    prepare:
    mov ecx, edx
    mov edx, [esp+16]
    copy:
    mov al, BYTE PTR [edx]
    inc edx
    mov BYTE PTR [ecx-1], al
    inc ecx
    cmp al, 0
    jne copy
    exit:
    pop edx
    pop ecx
    mov eax, [esp+12]
     
  2. ntldr

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

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    это не памят выделяется, а позиция в стеке (+12 - первый параметр функции, +16 - второй)
     
  3. St0nX

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

    Joined:
    19 May 2007
    Messages:
    257
    Likes Received:
    46
    Reputations:
    0
    my_strcat:
    push ecx пихаем еcx в стек
    push edx пихаем edx в стек
    mov edx, [esp+12] присваиваем edx значение верхушки стека + 12(эт первая строка)
    find_end:
    mov al, BYTE PTR [edx] один байт по адресу edx пихаем в al
    inc edx сдвигаем адрес на 1
    cmp al, 0 проверяем ни конец ли строки часом...
    inc find_end тут какая то хрень по идее должен быть джамп если не конец
    prepare:
    mov ecx, edx адрес конца строки пихаем в еcx
    mov edx, [esp+16] присваиваем edx верхушка стека + 16 (эт я так понял вторая строка)
    copy:
    mov al, BYTE PTR [edx] берем 1 байт суем в al
    inc edx увеличиваем адресс
    mov BYTE PTR [ecx-1], al пихаем в конец 1 строки этот байт
    inc ecx сдвигаем адресс 1 строки
    cmp al, 0 проверяем не конец ли 2 строки
    jne copy
    exit:
    pop edx восстанавливаем регистр
    pop ecx восстанавливаем регистр
    mov eax, [esp+12] пихаем адресс результата в eax

    Ты бы лучше книжку почитал какую и сам разобрался тут ничего сверх сложного нету.