Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.227.69] |
|
Сообщ.
#1
,
|
|
|
Всем доброго времени суток!
Возникла проблемка.. Пишу вот такой вот код: #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 помещаются в стек уже после моих параметров..? Адрес возврата тоже.. Почему программа валится? ЧТо тут неправильно? Как это можно избежать? Всем заранее спасибо за помощь. |
Сообщ.
#2
,
|
|
|
Цитата byte,8.02.04, 01:14 Если вызов func(...) расскоментировать, то програ заваливается..(если нет, то все ОК) Собсно, почему? Да что с func(), что без неё - у тебя при выходе из print_str() слетает ESP... |
Сообщ.
#3
,
|
|
|
Сравниваем листинги и все встает на свои места:
Цитата ; 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; и должно заработать нормально. |