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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
А там точно регистры разные? 07.01.03 16:10  Число просмотров: 830
Автор: 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;
А если ты переписал все правильно, то тут уж надо смотреть во что оно компилится в коде, потому как у разных компилеров разные соглашения о порядке выделения регистров при передаче параметров через них, во вторых функция инлайновая - тут оптимизатор вообще обрежет любую передачу параметров, а будет работать с теми значениями, которые уже находятся в регистрах (где окажутся на момент вызова - с тем и будет работать) и так далее.
<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-2022 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach