информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыПортрет посетителяСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
А там точно регистры разные? 07.01.03 22:24  Число просмотров: 1140
Автор: toobig Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Точно разные. Я ее из исходников скопировал. Компилятор Microsoft'овский от VC++ 6.0.
<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-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach