Форум: "Прочее";
Текущий архив: 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