Статья "Ассемблер в Unix": выравнивание стека

Тема в разделе "WASM.UNIX", создана пользователем B_108, 27 окт 2004.

  1. B_108

    B_108 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    62
    В статье (_http://wasm.ru/article.php?article=asminunix)

    есть вот такой кусок (пример вызова сист. функции в FreeBSD):


    Код (Text):
    1.  
    2. sys_call:
    3.  
    4.              int  0x80
    5.  
    6.              ret
    7.  
    8.        start:
    9.  
    10.          push msg_len   ; размер строки
    11.  
    12.          push msg       ; адрес строки
    13.  
    14.          push 1         ; stdout
    15.  
    16.          mov  eax,4     ; номер системной функции - sys_write
    17.  
    18.          call sys_call
    19.  
    20.          [b] add  esp,4*3   ; очищаем за собой стек [/b]
    21.  




    Впрочем, от функции sys_call можно отказаться, достаточно просто помещать в стек лишний dword:


    Код (Text):
    1.  
    2. start:
    3.  
    4.               push msg_len   ; размер строки
    5.  
    6.               push msg       ; адрес строки
    7.  
    8.               push 1         ; stdout            
    9.  
    10.               mov  eax,4     ; номер системной функции - sys_write
    11.  
    12.               push eax       ; все что угодно  
    13.  
    14.               int  0x80
    15.  
    16.             [b]add  esp,4*3   ; очищаем за собой стек [/b]
    17.  




    Вопрос: во втором случае мы пушим в стек 4 дворда (пусть даже один из них не используемый), почему тогда к esp прибавляется 4*3, а не 4*4 ?
     
  2. B_108

    B_108 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    62
    А все таки нада прибавлять 4*4,

    иначе ранее запушенные значения не восстанавливаются.