Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Assembler: что выполняет ета процедура ?

24K
22 января 2007 года
ivgeni_r
3 / / 22.01.2007
push ebp
mov ebp,esp
push esi
mov esi,4[ebp]
mov eax,[esi]
add eax,4[esi]
add esi,8
mov 4[ebp],esi
pop esi
pop ebp
ret

и как ее можно назвать?
зарание спасибо за ответ.
20K
22 января 2007 года
lnkgyv3
17 / / 12.01.2007
Цитата: ivgeni_r
push ebp
mov ebp,esp
push esi
mov esi,4[ebp]
mov eax,[esi]
add eax,4[esi]
add esi,8
mov 4[ebp],esi
pop esi
pop ebp
ret

и как ее можно назвать?
зарание спасибо за ответ.



Запихивает в стек ebp, esi. Проводит какиет-то исчисления (к чему они? необходимо знать что сама процедура хоть приблизительно должна делать), а потом восстанавливает значения ebp, esi из стека.

9
22 января 2007 года
Lerkin
3.0K / / 25.03.2003
2lnkgyv3 Очень грамотный ответ. Главное, содержательный.

Попробую вспомнить интерфейс с ассемблером ;)
Код:
push ebp
    mov ebp,esp    ; Вроде как, организация стекового кадра.
    push esi

    mov esi,4[ebp]
    mov eax,[esi]   ; получить первый, переданный в функцию аргумент
    add eax,4[esi]  ; сложить его со вторым переданным аргументом

    add esi,8
    mov 4[ebp],esi ; вот тут не понял - зачем это. Адрес возврата???

    pop esi
    pop ebp
    ret            ; восстановление стека и возврат из функции


Очевидно, это функция сложения двух целочисленных значений.
Вызов этой функции из языка высокого уровня (например: С), может выглядеть вот так:
 
Код:
extern "С" int add( int x, int y);    // объявление функции

...

    int r, x = 5, y = 10;

    r = add( 5, 10 );  // собственно, вызов функции



P.S. МОГУ ОШИБАТЬСЯ! Долго уже к этой теме не обращался. Кстати, и выражение extern "C" может быть другим!
1.8K
22 января 2007 года
k3Eahn
365 / / 19.12.2005
Мои пять копеек:
Цитата: ivgeni_r

Код:
push ebp
mov ebp,esp
push esi
mov esi,4[ebp]      ;грузит в esi адрес возврата
mov eax,[esi]        ;грузит в eax 4 байта по адресу возврата
add eax,4[esi]       ;добавляет к eax 4 байта по адресу возврата + 4
add esi,8
mov 4[ebp],esi      ;сдвигает адрес возврата на 8 байт в
                           ;сторону старших адресов
pop esi
pop ebp
ret


Не исключено, что я ошибаюсь, но данная функция (именно в том виде, в каком её выложил автор, упадёт.

3
22 января 2007 года
Green
4.8K / / 20.01.2000
Да нет, не обязательно упадет.
Всё зависит от вызывающего кода.
24K
22 января 2007 года
ivgeni_r
3 / / 22.01.2007
во первых спасибо за ответы.
во вторых ета процедура точно чтото делает.

дело в том что у етой процедуры есть смысл.
вопрос заключается в названии .

лично я склонен к варианту "сложения двух целочисленных значений".
9
22 января 2007 года
Lerkin
3.0K / / 25.03.2003
А ты ничего с кодом не напутал? точно такой код?
Просто я, по скудоумию, не усмотрел что юзается адрес возврата вместо аргумента.
334
22 января 2007 года
HexEdit
809 / / 27.07.2006
На первый взгляд скажу так - код абсолютно неверный.
Объясню:
Цитата:
push ebp
mov ebp,esp


после этого, [EBP] = старое значение EBP, а [EBP+4] = адрес возврата

Цитата:
mov esi,4[ebp]


как уже сказано - грузит в ESI адрес возврата. А зачем... ладно тут еще можно что-нибудь придумать... далее

Цитата:
mov eax,[esi]


а тут что делается? загружается в eax значение из ячейки по адресу, равному коду инструкции (так как в ESI адрес возврата). и что? зачем? что это?

Цитата:
add eax,4[esi]
add esi,8
mov 4[ebp],esi


а тут уже вообще ничего не понятно.
add eax, 4[esi] - что тут? по адресу, равному коду инструкции еще и структура?!, да нифига себе!

Короче, тут явно ошибка!!!

24K
23 января 2007 года
ivgeni_r
3 / / 22.01.2007
Цитата: HexEdit
На первый взгляд скажу так - код абсолютно неверный.
Объясню:

после этого, [EBP] = старое значение EBP, а [EBP+4] = адрес возврата

как уже сказано - грузит в ESI адрес возврата. А зачем... ладно тут еще можно что-нибудь придумать... далее

а тут что делается? загружается в eax значение из ячейки по адресу, равному коду инструкции (так как в ESI адрес возврата). и что? зачем? что это?

а тут уже вообще ничего не понятно.
add eax, 4[esi] - что тут? по адресу, равному коду инструкции еще и структура?!, да нифига себе!

Короче, тут явно ошибка!!!



Ето совсем не утешает :)
код точно етот я перепроверил.
в вапросах такого формата ответ типа, код полная лажа не примут.
а завтра мне здавать :(

огромное спасибо за дискуссию.

1.8K
23 января 2007 года
k3Eahn
365 / / 19.12.2005
Если принять в рассмотрение то, что данная функция подразумевает какой-то специфический calling convention (передача параметров в коде, находящемся после инструкции вызова), то тогда действительно можно сказать, что это функция сложения двух двойных слов.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог