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 Заранее спасибо за помощь начинающему |
|
Создано: 11 марта 2007 15:39 · Личное сообщение · #2 там нафиг целых четыре регистра общего назначенич, а на return value использовать только один = ну и что ето за опти... ...кстати есть fastcall, так что парамы не только в стеке передаются, для процессора это самый оптимальный вариант= использовать регистры, так же и вернуть можно не в одном регистре , а в стольки, в скольки ТЕБЕ НАДО, ето веть АСМ... ...кстати можно не только флаги дергать, есть еще ХММ и ММХ... |
|
Создано: 11 марта 2007 23:26 · Личное сообщение · #3 drunk_master пишет: там нафиг целых четыре регистра общего назначенич Никто не спорит. Но тогда придется регистры сохранять перед вызовом твоей ф-ии. X_MEM пишет: > call fMyFunction > jnz lError > результат в EAX Разве так оно не красивее? [i]drunk_master пишет: для процессора это самый оптимальный вариант= использовать регистры А мы что и делаем! Используем РЕГИСТР флагов.. |
|
Создано: 12 марта 2007 06:53 · Личное сообщение · #4 Действительно довольно общий стандарт - использование флага переполнения, т.к. на некоторых процах кроме аккумулятора других регистров нет. Для Интела расширенный стандарт - регистр EDX. ECX - это для циклов и EBX - регистр индексов... Дельфи тот действительно сначала использует регистры и только потом память - горе-оптимизаторы. А юзеры мучатся |
|
Создано: 14 марта 2007 03:27 · Личное сообщение · #5 блин, Хэ_мэн, то ты заранее благодариш за помощь "начинающеме", то чешешь как эксперт, я лет десять пишу только на асме, да и то растерялся, вобщем пиши как хочешь, а лучше, хотя бы раз, попробуй написать "как все" и рядом "так как ты" и сравни, и тогда вопрос почти отпадет на... кстати, асм мощен до ох.. и ты можешь чудить как хо... благодарю за тему с уважением d_m |
|
Создано: 14 марта 2007 10:12 · Личное сообщение · #6 |
|
Создано: 14 марта 2007 11:29 · Личное сообщение · #7 drunk_master пишет: там нафиг целых четыре регистра общего назначенич, а на return value использовать только один На самом деле РОНов 8 штук (32х), а резльтат может возвращаться не только в eax:edx (с ключем /GL). -=The Bone=- пишет: Попробуй еще в функцию передавать арес на переменную Result, в нее впихиваешь 0, если успех [...]. Так многие функции выньды делают Какие многие? Я навскидку вспомнил тока NdisXXX. Кстати, всегда было интересно, зачем так. |
|
Создано: 15 марта 2007 12:04 · Личное сообщение · #8 [i]S_T_A_S_ пишет верно: На самом деле РОНов 8 штук (32х), а резльтат может возвращаться не только в eax:edx (с ключем /GL). ...регистров общего назначения 8, я немного некорректно выразился, но при етом нерац использовать цепочечные si & di a так же указатель стека и указатель БАЗЫ КАДРА стека для возврата результата или кода еррора, да хотя и так извратиться можно.. ...я конечно имел ввиду ax,bx,cx,dx, их можно вовсю использовать и не греть лишний раз голову, кстати кто-то там назвал ебх регистром индекса, это неверно- это рег базы... |
|
Создано: 15 марта 2007 21:40 · Поправил: -=The Bone=- · Личное сообщение · #9 To S_T_A_S_ WriteFile/ReadFile возвращают например кол-во считанных байт, эта... как ее... GetFileSize вообще хитро возвращает код ошибки. А затем, что в eax они могут вернуть 0 - ошибки и 0 - правильный результат, и в этом случае надо проверить возвращенное в переменной значение (где 0 - успех). Только мало кто в наши дни это делает(проверку).... |
|
Создано: 16 марта 2007 07:10 · Поправил: S_T_A_S_ · Личное сообщение · #10 drunk_master пишет: нерац использовать цепочечные si & di a так же указатель стека и указатель БАЗЫ КАДРА стека для возврата результата Конечно нерационально юзать 16ти битные регистры в 32х битной винде bp - это указатель базы тока в 16х режиме, в 32х стек можно адресовать через esp. drunk_master пишет: кто-то там назвал ебх регистром индекса, это неверно- это рег базы В 32х битном режиме любой РОН может быть базой и (кроме esp) индексом. -=The Bone=- пишет: WriteFile/ReadFile возвращают например кол-во считанных байт Это ведь не статус ошибки, который она возвращает в eax. -=The Bone=- пишет: GetFileSize вообще хитро возвращает код ошибки. Доку почитай: If the function fails [...] the return value is INVALID_FILE_SIZE |
|
Создано: 16 марта 2007 21:26 · Поправил: -=The Bone=- · Личное сообщение · #11 S_T_A_S_ пишет: -=The Bone=- пишет: WriteFile/ReadFile возвращают например кол-во считанных байт Это ведь не статус ошибки, который она возвращает в eax. Какая разница, главное - принцип. Она могла бы возвращать кол-во прочитанных байт в eax, а статус ошибки - в памяти Доку почитай: If the function fails [...] the return value is INVALID_FILE_SIZE If the function fails and lpFileSizeHigh is NULL, the return value is 0xFFFFFFFF. To get extended error information, call GetLastError. If the function fails and lpFileSizeHigh is non-NULL, the return value is 0xFFFFFFFF and GetLastError will return a value other than NO_ERROR. (если ошибка, иначе NO_ERROR - размер файла = 4Гб - 1 байт ) |
|
Создано: 18 марта 2007 14:46 · Личное сообщение · #12 |
|
Создано: 18 марта 2007 19:04 · Личное сообщение · #13 |
|
Создано: 18 марта 2007 21:10 · Личное сообщение · #14 |
|
Создано: 19 марта 2007 12:38 · Личное сообщение · #15 If the function fails and lpFileSizeHigh is NULL, the return value is 0xFFFFFFFF. To get extended error information, call GetLastError. If the function fails and lpFileSizeHigh is non-NULL, the return value is 0xFFFFFFFF and GetLastError will return a value other than NO_ERROR Тождественно следующему: If the function fails { the return value is 0xFFFFFFFF. If lpFileSizeHigh is NULL, To get extended error information, call GetLastError. If is non-NULL, GetLastError will return a value other than NO_ERROR. } -=The Bone=- пишет: флуд не разводился ИМХО у тебя проблемы с логикой. Из этих слов следует, что он разводится сам собой. Однако, очевидно, что его кто-то создаёт. ;) |
<< . 1 . 2 . |
eXeL@B —› Программирование —› Передача параметров функцией на асме |
Эта тема закрыта. Ответы больше не принимаются. |