Сейчас на форуме: hgdagon, asfa (+4 невидимых)

 eXeL@B —› Программирование —› Передача параметров функцией на асме
<< . 1 . 2 .
Посл.ответ Сообщение

Ранг: 14.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 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
Заранее спасибо за помощь начинающему



Ранг: 29.2 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 11 марта 2007 15:39
· Личное сообщение · #2

там нафиг целых четыре регистра общего назначенич, а на return value
использовать только один = ну и что ето за опти...
...кстати есть fastcall, так что парамы не только в стеке передаются,
для процессора это самый оптимальный вариант= использовать регистры,
так же и вернуть можно не в одном регистре , а в стольки, в скольки
ТЕБЕ НАДО, ето веть АСМ...
...кстати можно не только флаги дергать, есть еще ХММ и ММХ...



Ранг: 14.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 11 марта 2007 23:26
· Личное сообщение · #3

drunk_master пишет:
там нафиг целых четыре регистра общего назначенич

Никто не спорит. Но тогда придется регистры сохранять перед вызовом твоей ф-ии.
X_MEM пишет:
> call fMyFunction
> jnz lError
> результат в EAX
Разве так оно не красивее?
[i]drunk_master пишет:
для процессора это самый оптимальный вариант= использовать регистры

А мы что и делаем! Используем РЕГИСТР флагов..



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 12 марта 2007 06:53
· Личное сообщение · #4

Действительно довольно общий стандарт - использование флага переполнения, т.к. на некоторых процах кроме аккумулятора других регистров нет. Для Интела расширенный стандарт - регистр EDX. ECX - это для циклов и EBX - регистр индексов... Дельфи тот действительно сначала использует регистры и только потом память - горе-оптимизаторы. А юзеры мучатся



Ранг: 29.2 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 14 марта 2007 03:27
· Личное сообщение · #5

блин, Хэ_мэн, то ты заранее благодариш за помощь "начинающеме", то чешешь как эксперт, я лет десять пишу только на асме, да и то растерялся, вобщем пиши как хочешь, а лучше, хотя бы раз, попробуй написать "как все" и рядом "так как ты" и сравни, и тогда вопрос почти отпадет на...
кстати, асм мощен до ох.. и ты можешь чудить как хо...
благодарю за тему
с уважением d_m



Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 14 марта 2007 10:12
· Личное сообщение · #6

To X_MEM

Попробуй еще в функцию передавать арес на переменную Result, в нее впихиваешь 0, если успех, и код ошибки, если ошибка (т.е. ERROR_OK=0 там, ERROR_INVALID_PARAMETER=1...). Так многие функции выньды делают



Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 14 марта 2007 11:29
· Личное сообщение · #7

drunk_master пишет:
там нафиг целых четыре регистра общего назначенич, а на return value
использовать только один

На самом деле РОНов 8 штук (32х), а резльтат может возвращаться не только в eax:edx (с ключем /GL).

-=The Bone=- пишет:
Попробуй еще в функцию передавать арес на переменную Result, в нее впихиваешь 0, если успех [...]. Так многие функции выньды делают

Какие многие? Я навскидку вспомнил тока NdisXXX. Кстати, всегда было интересно, зачем так.



Ранг: 29.2 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 15 марта 2007 12:04
· Личное сообщение · #8

[i]S_T_A_S_ пишет верно:
На самом деле РОНов 8 штук (32х), а резльтат может возвращаться не только в eax:edx (с ключем /GL).
...регистров общего назначения 8, я немного некорректно выразился,
но при етом нерац использовать цепочечные si & di a так же указатель стека и указатель БАЗЫ КАДРА стека для возврата результата или кода еррора, да хотя и так извратиться можно..
...я конечно имел ввиду ax,bx,cx,dx, их можно вовсю использовать и не греть лишний раз голову, кстати кто-то там назвал ебх регистром индекса, это неверно- это рег базы...



Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 15 марта 2007 21:40 · Поправил: -=The Bone=-
· Личное сообщение · #9

To S_T_A_S_
WriteFile/ReadFile возвращают например кол-во считанных байт, эта... как ее... GetFileSize вообще хитро возвращает код ошибки. А затем, что в eax они могут вернуть 0 - ошибки и 0 - правильный результат, и в этом случае надо проверить возвращенное в переменной значение (где 0 - успех). Только мало кто в наши дни это делает(проверку)....



Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 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



Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 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 байт )



Ранг: 29.2 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 18 марта 2007 14:46
· Личное сообщение · #12

кажись х_мем забил давно на тему...



Ранг: 14.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 18 марта 2007 19:04
· Личное сообщение · #13

-=The Bone=- пишет:
кажись х_мем забил давно на тему...

вопрос конечно уже решился, но это не значит, что я "забил" на тему



Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 18 марта 2007 21:10
· Личное сообщение · #14

to X_MEM
Так закрой её, что флуд не разводился (жаль, нету тут тегов [offtopic] [/offtopic])



Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 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 —› Программирование —› Передача параметров функцией на асме
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати