есть обычный код типа этого: Код (Text): ... pu PROTO :DWORD ... pu proc x:DWORD ... mov edi,x ... pu endp ... invoke pu,8 ... Так вот что то непонятное со значением в x. Прога нормально компилируется и работает пока я необращаюсь к функции pu, как только к ней обращаюсь - сразу прога виснет. Здесь точно что то не то с передачей значения, потому что когда место передачи значения x я использую глобальную переменную - все работает так, как надо. По каким причинам это может быть?
ret не забыл, вот код функции Код (Text): PUSH EBP MOV EBP,ESP xor eax,eax mov ecx,8 mov edi,x lab5: mov edx,0 add dl, 20h mov tSuma[edi],dl inc edi loop lab5 mov eax, number push eax xor ecx, ecx mov ebx, 10 oi2: xor edx,edx div ebx push edx inc ecx test eax, eax jnz oi2 mov esi,x oi3: pop edx add dl, 30h mov tSuma[esi],dl; add esi,1 loop oi3 pop eax MOV ESP,EBP POP EBP ret
Это не код - это жесть какая-то. Как минимум, если пролог-эпилог ты пишешь сам и ф-ция принимает параметры, ты должен эти параметры вытолкнуть из стека (либо сам либо return+размер параметров в байтах). push edx у тебя в одном цикле, а pop в другом, ты уверен, что не рушишь стек? Про оптимизацию я вообще молчу пока ))
Я же говорю, что функция четко работает когда я передаю значение через глобальную переменную. то есть она работает так, как задумано. То есть со стеком все четко (судя по "внешним" последствиям, то есть работает). А вот на счет вытолкнуть принятые параметры из стека - это интересно. Что то мне подсказывает что именно здесь проблема. Можно вас попросить, поподробней описать что мне нужно сделать в этом направлении. Про оптимизацию я тоже молчу пока. Как только функция заработает - буду думать как бы это попроще сделать...
Кстати а что это значит? А кто его еще кроме меня напишет? Я гдето читал что так надо! И все тут. Конечно все работает и без этого, ну надо так надо - вот и добавил. Или ненадо? Можно поподробней?
********* **** ******* **** ***** ******************* чтобы **** ***** **** твою ****** Чувак, ты отладчик открывать не пробовал? Потрассировать немного код, посмотреть, что на точке входа, что в стеке? П.С.: модераторы, разрешите мат на васме! ну очень прошу. Просто слов нет от такой школоты
Точно. Убрал пролог с эпилогом и все заработало! Мои вопросы с прологом в силе - хотелось бы разобратся зачем это надо, и когда это надо писать.
Ага, а вы наверное родились специалистом. Если нет слов, то вас ни кто незаставляет отвечать здесь. Идите в разделы для спецов - там глупых вопросов незадают.
Ну если компилятор у тебя масм и ф-ция имеет параметры, то пролог (push ebp, mov ebp, esp) и эпилог (mov esp, ebp, pop ebp) он напишет сам. Либо не пиши их вовсе и оставляй просто ret в конце ф-ции, либо в конце вместо ret - retn 4, ну или add esp, 4 и потом уже retn 4.
Я тебя не прошу в уме реверсить фемиду. Просто открой отладчик и посмотри. Ты даже не попытался ничего сделать, а уже побежал на форум. Вот если б ты спросил "я увидел в отладчике два пролога, откуда взялся второй?", это был бы нормальный вопрос новичка. Но ты же даже не попытался посмотреть, в чем там дело. Пытаться программировать и не использовать отладчик... бррр. На битву экстрасенсов Вам, батенька, надо
А ты неподумал что я чисто теоретически могу быть настолько тугодумным, что неумею этими делами пользываться. Разумеется со временем научусь, но вот например хотел в RadASMе посмотреть - так там надо еще строчки добалять для дебага. Тут бы в своем коде незаблудится, а меня просят еще что то добавлять - то есть 50% кода это строчки для отладки! Правда при глюках мой eVMB c++ показывает что то, но там вообще темный лес для меня...
MSoft Не буду вас больше злить). После решения проблемы с передачей значений у меня очень много задач появится, там уж точно прийдется это освоить. Без анализа отладчика сюда больше не сунусь)
sheef_ad почитай хелп к масму 611 или кипа ирвина там сказано что иногда директива proc генерирует код причем в хелпе довольно неплохо написано как управлять этой генерацией