Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.09.20;
Скачать: CL | DM;

Вниз

Интересный таки нюанс с инлайн асмом в MS VC++ 2010   Найти похожие ветки 

 
Rouse_ ©   (2015-02-07 12:11) [0]

У кого есть другие версии протестируйте плз:

#include "stdafx.h"

int gtc(){
__asm {
start:
  mov ecx,[7ffe0324h]
  mov edx,[7ffe0320h]
  mov eax,[7ffe0328h]
  cmp ecx,eax
  jnz _wait
  mov eax,[7ffe0004h]
  mul edx
  shl ecx,8
  imul ecx,[7ffe0004h]
  shrd eax,edx,18h
  shr edx,18h
  add eax,ecx
  jmp _done
_wait:
  pause
  jmp start
_done:
}
}

int _tmain(int argc, _TCHAR* argv[])
{
int i = gtc();
printf("%d", i);
getchar();
return 0;
}


Суть кода - эмулируем GetTickCount под Vista и выше (в ХР использовался немного другой механизм через зачитку TickCountLow идущим первым в структуре KUSER_SHARED_DATA).

В данном случае читаются регистры из той-же структры, но не много по другим офсетам:

7FFE0320 17 D7 E9 02                                           TickCount.LowPart = 2E9D717
7FFE0324 00 00 00 00                                           TickCount.High1Time = 0
7FFE0328 00 00 00 00                                           TickCount.High2Time = 0


и происходит сверка чтобы High1Time и High2Time совпадали (стандартный подход).

Так вот на сверке и происходит затык с выходом в бесконечный цикл _wait->start->_wait->start и т.д.

Получается это из-за того что сишный компилер, неверно, зараза, трактует мои инструкции, а именно:

    9:    mov ecx,[7ffe0324h]                // должно быть
010B101E  mov         ecx,7FFE0324h      // по факту
   10:    mov edx,[7ffe0320h]                // должно быть
010B1023  mov         edx,7FFE0320h      // по факту  
   11:    mov eax,[7ffe0328h]                // должно быть
010B1028  mov         eax,7FFE0328h        // по факту


Проверьте плз, у всех ли повторяется такая ситуация?

Можно конечно добавить "dword ptr ds:" перед [xxx], но... мы вообще-то и так по умолчанию с DS работаем, или я уже что-то совсем ничего не понимаю в ассемблере?

Короче.
Нужен тест или линк на доку, где явно указывается необходимость наличия сегментного DS префикса перед адресом.

Заранее Спасибо :)


 
Rouse_ ©   (2015-02-07 12:15) [1]

Кстати очень напоминает баг в старых версиях дельфи, когда вместо
"  lea ecx, $7ffe0324" (которая не требует в данном случае ясныз скобок) подставлялисо опкоды инструкции "  mov ecx, $7ffe0324"


 
Rouse_ ©   (2015-02-07 12:16) [2]

*ясныз - явных, пардон


 
Pavia ©   (2015-02-07 13:24) [3]

2008 тоже самое. Думаю да ошибка.


 
Rouse_ ©   (2015-02-07 14:48) [4]

Ага, спасибо, значит подход изначально был верный - не нужен сторонний компилер :)
Спасибо.


 
NoUser ©   (2015-02-07 21:49) [5]

да, в 2012 тоже

катит так:
  mov ecx, DS:[7ffe0324h]
  mov edx, dword ptr ds:0x7ffe0320



Страницы: 1 вся ветка

Текущий архив: 2015.09.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.006 c
2-1399194664
SchoolBase
2014-05-04 13:11
2015.09.20
Помогите пожалуйста с нормализацией базы


15-1421926934
Kerk
2015-01-22 14:42
2015.09.20
Вакансия


3-1305530024
Aybolit
2011-05-16 11:13
2015.09.20
Paradox 3.5


15-1422739804
Юрий
2015-02-01 00:30
2015.09.20
С днем рождения ! 1 февраля 2015 воскресенье


15-1422882243
ВладОшин
2015-02-02 16:04
2015.09.20
Set|Get CursorPos при закрытом окне RDP