Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2015.09.20;
Скачать: [xml.tar.bz2];

Вниз

Интересный таки нюанс с инлайн асмом в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.002 c
15-1422873582
Дмитрий С
2015-02-02 13:39
2015.09.20
Как убрать "Возможно, эта программа установлена неправильно"


15-1422357619
Kerk
2015-01-27 14:20
2015.09.20
Сжатие данных


15-1422999005
Юрий
2015-02-04 00:30
2015.09.20
С днем рождения ! 4 февраля 2015 среда


15-1422698737
brother
2015-01-31 13:05
2015.09.20
Локальная охрана


15-1422874601
Дмитрий С
2015-02-02 13:56
2015.09.20
Межпроцесная модальность.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский