Программирование на Ассемблере


Использование локальных областей памяти


Для выделения локальной области используется стек.

Структура стека с локальной областью:

; Сохранение регистров

; Локальная область памяти

EBP

EIP

; Фактические параметры

Для выделения локальной области используется команда:

SUB ESP, Размер локальной области

Для освобождения локальной области используется 2 способа:

  • ADD ESP, Размер локальной области
  • MOV   ESP, EBP
  • Последний способ более защищен от ошибок, связанных с асинхронным использованием стека



    Структура функции с локальной областью:

    Proc    Имя

    Push    EBP

    Mov     EBP, ESP

    SUB     ESP, Размер локальной области

    PUSH  Регистры

    POP    Регистры

    MOV   ESP, EBP

    POP    EBP

    RET     [Константа]

    Пример. Составить главную программу и функцию для преобразования числа в символьное представление.

    Алгоритм.

    void itoa (unsigned x){

      int numbers[] = {10000, 1000, 100, 10, 1};

      for (int I=0; I<5; I++){

          Y[I]= x/numbers[i] + ‘0’;

          X%= numbers[i];

    }

    }

    ideal

    p586

    model   flat

    codeseg

    proc itoa;                                 ebp                  0

    public itoa;                              eip                   4

    ;;                                              y                      8

    ;;                                              x                      12

    push  ebp

    mov   ebp, esp

    sub   esp, 5*4

    push  eax ebx ecx edx esi

    mov   [numbers], 10000

    mov   [numbers+4], 1000

    mov   [numbers+8], 100

    mov   [numbers+12], 10

    mov   [numbers+16], 1

    mov     ecx, 5

    mov     eax, [ebp+12]

    mov     ebx, [ebp+8]

    lea     esi, [numbers]

    for1:

    xor     edx, edx

    div     [dword ptr esi]

    add     al, '0'

    mov     [ebx], al

    inc     ebx

    add     esi, 4

    mov     eax, edx

    loop    for1

    mov     [byte ptr ebx], 0

    pop     esi edx ecx ebx eax

    mov     esp, ebp

    pop     ebp

    ret     8

    endp    itoa

    end

    Составьте самостоятельно главную программу для этого примера и проверьте ее на машине!



    Содержание раздела