Подскажите , почёму выкидывает?

Тема в разделе "WASM.BEGINNERS", создана пользователем ajak, 1 июл 2008.

  1. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Код (Text):
    1. // Листинг 1.11 Вызов  функции Си из ассемлерного блока
    2. // команды CALL и RET
    3.  
    4. #include <stdio.h>
    5. #include <windows.h>
    6.  
    7. int fsub(int ,int);
    8. int a;
    9. char s[]="%d";
    10.  
    11. void main()
    12. {
    13.     _asm {
    14.             push 100
    15.             push 250
    16.             call fsub
    17.             mov a, eax
    18.             lea eax, s
    19.             push a
    20.             push eax
    21.             call printf
    22.             add esp,8
    23.     }
    24. }
    25. int fsub(int a, int b)
    26. {
    27.     __asm
    28.     {
    29.         mov eax,a
    30.         sub eax,b
    31.         ret 8
    32.     }
    33. }
    Код верно переписан из книги. Но мне кажется дело в add esp,8. Но сколько я не мучил ничего не получается. Что-то со стеком.

    Great: про тег [code] не забываем=)
     
  2. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Нужно сделать
    int _declspec(naked) fsub(int a, int b), а то компилятор генерирует стандартный пролог и эпилог.
     
  3. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    ajak
    Код (Text):
    1. void main(void) { /* BHC style */
    2.   printf("%d\n", -150);
    3. }
    Соптимизировал и сделал более кросс-платформенным ж-)
     
  4. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
  5. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Нечёт не помогает :dntknw:
    И вообще я такую конструкция вижу впервый раз.
    Компилю студией 2005
     
  6. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Если вот так, то у меня работает ))
    call dword ptr [printf]

    Хех, только выходит с кодо 10, который printf возвращает )
     
  7. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    а дебугер
    запустить не судба?
     
  8. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    почему не судьба, запускаю, он пишет оишбку на вызове функции мля :dntknw:
     
  9. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    ну тогда попробуй
    Код (Text):
    1. int _stdcall fsub(int a, int b)
    и да - убери в ней RET 8 (а то сишные компилеры этого не любят!!111)
     
  10. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Мля,не знаю что ей нужно, не хочет, выкидывает. Остановка на вызове функции.
     
  11. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    ajak
    Не проще ли в Olly посмотреть, что там происходит?

    Но если с Olly совсем все плохо -- выложи сюда, а то предполагать, в каком виде сейчас исходник можно довольно долго.
     
  12. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    ajak Понимаешь, книга наверняка про старые компиляторы. Я бы не мучался и прочел бы доку по Студии. По моему опыту "соглашения о связях" постоянно меняются.
    Ну и второе : ты так и не сказал на каком вызове вылетает. Если в printf, значит ты просто ей не то передал. В отладчике смотри параметры. Кстати студия позволяет "влезать внутрь" системных функций - там и увидишь, что ты ей подсунул и почему она вылетает.
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Код (Text):
    1. #include <stdio.h>
    2. #include <windows.h>
    3.  
    4. int fsub(int ,int);
    5. int a;
    6. char s[]="%d";
    7.  
    8. void main()
    9. {
    10.     _asm {
    11.             push 100
    12.             push 250
    13.             call fsub
    14.             add esp, 8             ; FIXED! because of _cdecl
    15.  
    16.             mov a, eax
    17.             lea eax, s
    18.             push a
    19.             push eax
    20.             call printf
    21.             add esp,8
    22.  
    23.             xor eax, eax       ; FIXED! Return value
    24.     }
    25. }
    26. int fsub(int a, int b)
    27. {
    28.     __asm
    29.     {
    30.         mov eax,a
    31.         sub eax,b
    32.         leave               ; FIXED! Stack correction
    33.         ret
    34.     }
    35. }