На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Стек, ASM.. , Передать параметры в printf
    Всем доброго времени суток!
    Возникла проблемка.. Пишу вот такой вот код:
    ExpandedWrap disabled
       
      #include <stdio.h>
      //---------------------------------------------------
      int func(int a, int b) {
          return(a + b);
      }
      //---------------------------------------------------
      int print_str() {
          char* name = "Denis";
          char* stat = "cool";
          int   age  = 16;
       
       __asm push stat;
       __asm push age;
          __asm push name;
       
      //  func(4, 5);
       
       printf("My name is %s. I'm %d years old and I am a %s programmer!\n");
          return(0);
      }
      //---------------------------------------------------
      int main(int argc, char** argv) {
          print_str();
       return(0);
      }

    Если вызов func(...) расскоментировать, то програ заваливается..(если нет, то все ОК) Собсно, почему?
    Насколько я понимаю, числа 4 и 5 помещаются в стек уже после моих параметров..? Адрес возврата тоже.. Почему программа валится? ЧТо тут неправильно? Как это можно избежать?
    Всем заранее спасибо за помощь.
      Цитата byte,8.02.04, 01:14
      Если вызов func(...) расскоментировать, то програ заваливается..(если нет, то все ОК) Собсно, почему?

      Да что с func(), что без неё - у тебя при выходе из print_str() слетает ESP...
        Сравниваем листинги и все встает на свои места:
        Цитата
        ; 12 : __asm push stat;
        push DWORD PTR _stat$[ebp]
        ; 13 : __asm push age;
        push DWORD PTR _age$[ebp]
        ; 14 : __asm push name;
        push DWORD PTR _name$[ebp]
        ...
        ; 17 :
        ; 18 : printf("My name is %s. I'm %d years old and I am a %s programmer!\n");

        push OFFSET FLAT:??_C@_0DL@IAHH@My?5name?5is...; `string'
        call _printf
        add esp, 4

        и
        Цитата
        ; 20 : printf("My name is %s. I'm %d years old and I am a %s programmer!\n",name,age,stat);

        mov eax, DWORD PTR _stat$[ebp]
        push eax
        mov ecx, DWORD PTR _age$[ebp]
        push ecx
        mov edx, DWORD PTR _name$[ebp]
        push edx
        push OFFSET FLAT:??_C@_0DL@IAHH@My?5name?5is...; `string'
        call _printf
        add esp, 16 ; 00000010H

        После вызова printf в первом случае ESP сбивается. Тогда там надо после printf написать __asm add esp,12; и должно заработать нормально.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0297 ]   [ 16 queries used ]   [ Generated: 1.05.24, 07:48 GMT ]