Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
Еще идея: если компилировать с /gr или inline char fastcall listend( register unsigned int ofs ) , то второй параметр передается как раз в регистре edx. но тогда встает вопрос - зачем строка mov eax,ofs ; ( 08.01.03 00:54 Число просмотров: 966
Автор: pup3 Статус: Незарегистрированный пользователь Отредактировано 08.01.03 01:33 Количество правок: 1
|
Однако если переопределить Shl макросом, то получится обработка 64 битного значения (ведь они обрабатываются именно в паре регистров edx : eax ) ; )
ЗЫ:" Не стреляйте в пианиста - он играет как умеет" (c) ;)))))))))))))
|
<programming>
|
[C++] Help!!! Что делает эта функция? 07.01.03 10:55
Автор: toobig Статус: Незарегистрированный пользователь
|
inline char ListEnd( register unsigned int Ofs )
{
register char Result= 0;
__asm
{
Mov Eax,Ofs
Shl Edx,1
Adc Result,0
}
return Result;
}
|
|
Как оказалось, без бутылки не обошлось. :))) 08.01.03 21:43
Автор: toobig Статус: Незарегистрированный пользователь
|
Удалось пообщаться с разработчиком - все это оказывается портировалось с Unix'а. И была сделана попытка адаптировать все это под VC++. Действительно ошибка и действительно можно было обойтись без ассемблера.
Спасибо за помощь!!!! :-))
|
|
Еще идея: если компилировать с /gr или inline char fastcall listend( register unsigned int ofs ) , то второй параметр передается как раз в регистре edx. но тогда встает вопрос - зачем строка mov eax,ofs ; ( 08.01.03 00:54
Автор: pup3 Статус: Незарегистрированный пользователь Отредактировано 08.01.03 01:33 Количество правок: 1
|
Однако если переопределить Shl макросом, то получится обработка 64 битного значения (ведь они обрабатываются именно в паре регистров edx : eax ) ; )
ЗЫ:" Не стреляйте в пианиста - он играет как умеет" (c) ;)))))))))))))
|
| |
Чего-то у меня тоже впечатление что без макросов не обошлось 08.01.03 13:30
Автор: amirul <Serge> Статус: The Elderman
|
> Однако если переопределить Shl макросом, то получится > обработка 64 битного значения (ведь они обрабатываются > именно в паре регистров edx : eax ) ; ) >
Кроме того не понятно на фига явно указывать register для аргумента инлановой функции, типа без этого он туда через стек передается. И в общем-то даже если и edx:eax сдвигается, то возвращается только старший бит edx, а от eax-а он совсем не зависит и не стоило себе мозги морочить.
ЗЫ: А чей код-то? Сильно это похоже или на ошибку или на намеренное запудривание мозгов.
ЗЗЫ: Самый правильный способ: перед "mov eax, ofs" поставить "int 3" - запускать SoftICE делать в нем i3here, компилить и ждать. Можно конечно и без айса, одним встроенным в VC долбаггером, но это просто дело вкуса.
|
|
А там точно регистры разные? 07.01.03 16:10
Автор: amirul <Serge> Статус: The Elderman
|
> inline char ListEnd( register unsigned int Ofs ) > { > register char Result= 0; > > __asm > { > Mov Eax,Ofs > Shl Edx,1 > Adc Result,0 > } > return Result; > }
потому как если бы было так
mov eax, ofs
shl eax, 1
adc result, 0
То он просто возвращает старший (31-й) бит переданного аргумента (ofs), хотя я бы это сделал так
return ofs>>31;
А если ты переписал все правильно, то тут уж надо смотреть во что оно компилится в коде, потому как у разных компилеров разные соглашения о порядке выделения регистров при передаче параметров через них, во вторых функция инлайновая - тут оптимизатор вообще обрежет любую передачу параметров, а будет работать с теми значениями, которые уже находятся в регистрах (где окажутся на момент вызова - с тем и будет работать) и так далее.
|
| |
А там точно регистры разные? 07.01.03 22:24
Автор: toobig Статус: Незарегистрированный пользователь
|
Точно разные. Я ее из исходников скопировал. Компилятор Microsoft'овский от VC++ 6.0.
|
| | |
Какаято оптимизация хитрая. Сотри что с EDX делается перед вызовом процедуры. Или компилер просто так это впихнул Ж-). 08.01.03 00:29
Автор: Killer{R} <Dmitry> Статус: Elderman
|
|
|
А ты уверен что не перепутал Edx и Eax? Если перепутал то функция возвращает 1 если в Ofs установлен старший бит (отрицательное к примеру оно). 07.01.03 16:04
Автор: Killer{R} <Dmitry> Статус: Elderman
|
|
|
|