eXeL@B —› Программирование —› Передача параметров функцией на асме |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 07 марта 2007 02:22 · Личное сообщение · #1 Вопрос возник такой.. Есть ф-ия. Она возвращает результат (это число) допустим в EAX. При ошибке (я не имею ввиду битые указатели или прочие exeption - для этого есть SEH) ф-ия должна сообщить об этом нулем в регистре. Но в EAX может быть 0 и без ошибки! Т.е. результат обработки может быть равен 00h. Как быть? Есть пока 2 решения: 1. В EAX результат, в другом регистре 0 или не 0 для контроля ошибки. (Но вызов твкой ф-ии выглядит не красиво. Хотелось бы использовать только 1 регистр) 2. Результат помещается в память. В EAX указатель или 0 при ошибке. (Результат помещается в память ф-ей, а программисту это может и не надо. Придется ему обратно из памяти в регистр пересылать. Оптимизацией не пахнет!). Так вот. Можно ли использовать для контроля ошибок ФЛАГИ! Я сам в принципе не встречал таких ф-ий. Но тогда почему? Ведь команды ret и pop не влияют на состояние флагов! Зато как красиво бы было: > call fMyFunction > jnz lError > результат в EAX Заранее спасибо за помощь начинающему |
|
Создано: 07 марта 2007 05:11 · Личное сообщение · #2 |
|
Создано: 07 марта 2007 07:59 · Личное сообщение · #3 |
|
Создано: 07 марта 2007 08:18 · Личное сообщение · #4 |
|
Создано: 07 марта 2007 08:23 · Личное сообщение · #5 |
|
Создано: 07 марта 2007 08:23 · Личное сообщение · #6 |
|
Создано: 07 марта 2007 08:39 · Личное сообщение · #7 ИМХО - неудобно. в функции нужно его ставить - скорее всего это отдельное действие. потом проверять - причём сразу после выхода из функции, или сохранять регистр флагов, что тоже не всегда удобно. Bitfry пишет: о почему другие так не делают? Ну делают, иногда. К примеку дизасм длин от Ms-Rem-а так делает вроде. |
|
Создано: 07 марта 2007 09:12 · Личное сообщение · #8 UsAr пишет: можно еще использовать SetLastError/GetLastError Не хочу вызывать WinAPI. HoBleen пишет: Только будет ли вообще такой способ быстрым? Мб перегружается кеш кода при jzz после retn, не знаю.. После функции как-то надо разветвить действия (нормальный ход и ошибка). Мы рассмотрим любые предложения (более-менее красивые и простые). asd пишет: ИМХО - неудобно. в функции нужно его ставить - скорее всего это отдельное действие. потом проверять - причём сразу после выхода из функции, или сохранять регистр флагов, что тоже не всегда удобно. Вот в данном случае отдельное действие только для SHE (одна команда or), а так CF выставляется в ходе вычислений. На мой взгляд, идея довольно красивая. Функция как бы превращается в команду, влияющую на флаг. asd пишет: Ну делают, иногда. К примеку дизасм длин от Ms-Rem-а так делает вроде. Хм... Надо глянуть, хотя говорят, код Ms-Rem-а плохо читается, так что он для меня не пример. Кто-нибудь знает ЯВУ-компилятор, который такое создаёт? ----- Всем привет, я вернулся |
|
Создано: 07 марта 2007 09:22 · Личное сообщение · #9 |
|
Создано: 07 марта 2007 10:32 · Личное сообщение · #10 |
|
Создано: 08 марта 2007 20:21 · Личное сообщение · #11 |
|
Создано: 08 марта 2007 20:24 · Личное сообщение · #12 |
|
Создано: 08 марта 2007 20:25 · Личное сообщение · #13 |
|
Создано: 08 марта 2007 23:15 · Личное сообщение · #14 X_MEM writes: UsAr Что за структура TEB? GetLastError - это я так понимаю функция API. А что если моя ф-ия не возвращает никаких ошибок? Т.е. ошибка то есть, но об этом знает тольео мой код. А в системе ошибки никакой не зафиксировано! Вот структура TEB hxxp://usar.pp.ru/download/trash/TEB.inc просто пишешь assume fs:nothing xor eax,eax mov fs:[eax].TEB.LastErrorValue,ERROR_SUCCESS если небыло ошибок или что угодно другое если были. А вторую часть вопроса не понял. Какая разница системная функция вызвала ошибку или твой код. |
|
Создано: 08 марта 2007 23:23 · Личное сообщение · #15 Разница в самой ошибке! Я же говорил, что exception обрабатывается SEH'ом. Системная ф-ия такого рода ошибки не фиксирует. Т.е. если например функции передали строку с числом такого вида: 'Yahoo', то ошибки никакой нету для системы. А я то должен сказать программисту, что он дурак При этом значение TEB.LastErrorValue не меняется! |
|
Создано: 08 марта 2007 23:45 · Поправил: UsAr · Личное сообщение · #16 Error codes are 32-bit values (bit 31 is the most significant bit). Bit 29 is reserved for application-defined error codes; no Win32 API error code has this bit set. If you are defining an error code for your application, set this bit to indicate that the error code has been defined by your application and to ensure that your error code does not conflict with any system-defined error codes.
устанавливай 29 бит и не мучайся |
|
Создано: 09 марта 2007 05:17 · Личное сообщение · #17 |
|
Создано: 09 марта 2007 06:03 · Личное сообщение · #18 |
|
Создано: 09 марта 2007 06:39 · Личное сообщение · #19 Bitfry writes: Лучше уж тогда просто определить переменную в секции данных для своих ошибок, это будет корректнее и обращение одной командой, а не двумя одна из которых с префиксом. Что может быть некорректного в методе описанном в MSDN? Имхо, нормальные функции должны быть легко отделимы от самого кода и переписаны на другом HLL языке. Если надо оптимизировать по размеру или функцию никто на другой язык переносить не собирается, то другое дело. Тут можно использовать хоть второй регистр, хоть флаги. Лично я бы записывал результат по указателю переданному одним из параметров, а в eax возвращал статус, многие WinAPI так поступают PS: mov fs:[0].TEB.LastErrorValue,ERROR_SUCCESS в одну комманду, но по размеру больше |
|
Создано: 09 марта 2007 08:28 · Личное сообщение · #20 |
|
Создано: 09 марта 2007 08:35 · Личное сообщение · #21 |
|
Создано: 09 марта 2007 08:55 · Личное сообщение · #22 |
|
Создано: 09 марта 2007 09:24 · Личное сообщение · #23 |
|
Создано: 09 марта 2007 09:36 · Личное сообщение · #24 X_MEM пишет: Придется ему обратно из памяти в регистр пересылать. Оптимизацией не пахнет! Это "потерянное" время, ИМХО, очень мало относительно самого времени выполнения функции. А вот удобство, красота (+переносимость) и надежность намного важнее пары тактов, тогда уж надо улучшать сам алгоритм ф-и, который зачастую можно НАМНОГО сильнее ускорить нежели избавление обращений к памяти ИМХО. |
|
Создано: 09 марта 2007 09:48 · Личное сообщение · #25 |
|
Создано: 09 марта 2007 09:59 · Личное сообщение · #26 Да нет, насчет надежности - это я в общем случае, когда пытаешься все соптимизить, извращаешься, тратишь туеву хучу времени на отладку и в результате получается либо глюкалово, либо овчинка не стоила выделки... Так становится жалко за время... Так что лучше не парься и не придавай значения такой ерунде =) |
|
Создано: 09 марта 2007 10:17 · Личное сообщение · #27 |
|
Создано: 09 марта 2007 10:54 · Личное сообщение · #28 Ого-го, это че за наезды на UsAr,он предоставил инфу, которую должен знать(!) каждый кодер, ведь вопрос как поставили: Bitfry пишет: Мы рассмотрим любые предложения... Это был один из вариантов, тем более: HoBleen пишет: ...А вот удобство, красота (+переносимость) и надежность намного важнее пары тактов, тогда уж надо улучшать сам алгоритм ф-и, который зачастую можно НАМНОГО сильнее ускорить нежели избавление обращений к памяти ИМХО. Какое тут нах ИМХО(?) – это золотые слова, особенно если учесть: Хотел бы на их лица посмотреть, когда начнут писать проги на ASM`е размером ~3метра, одни только прототипы для функций чего стоят, не говоря уже о времени компиляции при обработке директифф.., макрософф и т. д. Когда в проекте участвуют 17 человек и некоторые из них пишут модули на ЯВУ, причем технологии COM (интерфейс) тоже участвует в проекте, мда… короче я в шоке… UsAr не обращай внимание и не злись всегда рады твоему участию на форуме… пиши побольше паблик-исходников!!! Они многим могут помочь!!! ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 09 марта 2007 23:34 · Личное сообщение · #29 X_MEM пишет: Можно ли использовать для контроля ошибок ФЛАГИ! Я сам в принципе не встречал таких ф-ий. Но тогда почему? Всегда на асме так и писали, кроме тех, кто учился по туториалам Iczelion'а. Не обязательно привязываться к флагу C. Можно посмотреть, что делает и в каком контексте вызывается функция и смысл возвращаемой ошибки. Часто флаги можно установить без отдельной команды, как побочный результат других. Используя несколько флагов, можно вазвращать более 2х состояний. Bitfry пишет: говорят, код Ms-Rem-а плохо читается Еще говорят, что сорцы fasm читаются хорошо ;) Bitfry пишет: определить переменную в секции данных для своих ошибок, это будет корректнее Это не многопоточно, в отличае от SEH. Chingachguk пишет: Dos-компиллеры HLL так делают вроде Современные компиляторы обычно делают ужас из типа bool, хотя могли бы поступать так же. |
|
Создано: 09 марта 2007 23:50 · Личное сообщение · #30 S_T_A_S_ пишет: Часто флаги можно установить без отдельной команды, как побочный результат других Так оно и получилось: Bitfry пишет: Вот в данном случае отдельное действие только для SHE (одна команда or), а так CF выставляется в ходе вычислений. S_T_A_S_ пишет: Используя несколько флагов, можно вазвращать более 2х состояний Правильно |
. 1 . 2 . >> |
eXeL@B —› Программирование —› Передача параметров функцией на асме |
Эта тема закрыта. Ответы больше не принимаются. |