информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяСетевые кракеры и правда о деле ЛевинаSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Еще идея: если компилировать с /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
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach