Удалось пообщаться с разработчиком - все это оказывается портировалось с 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 ) ; ) >
Кроме того не понятно на фига явно указывать register для аргумента инлановой функции, типа без этого он туда через стек передается. И в общем-то даже если и edx:eax сдвигается, то возвращается только старший бит edx, а от eax-а он совсем не зависит и не стоило себе мозги морочить.
ЗЫ: А чей код-то? Сильно это похоже или на ошибку или на намеренное запудривание мозгов.
ЗЗЫ: Самый правильный способ: перед "mov eax, ofs" поставить "int 3" - запускать SoftICE делать в нем i3here, компилить и ждать. Можно конечно и без айса, одним встроенным в VC долбаггером, но это просто дело вкуса.
А там точно регистры разные?07.01.03 16:10 Автор: amirul <Serge> Статус: The Elderman
потому как если бы было так
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