- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
__declspec (naked) INT16U getWordOfCPUFlags(void)
{
_asm
{
pushf;
xor eax, eax;
pop ax;
ret;
}
}
void setWordOfCPUFlags(const INT16U WordOfCPUFlag)
{
_asm
{
push WordOfCPUFlag;
popf;
}
}
bool getCPUTraceFlag(void)
{
return 0 != (getWordOfCPUFlags() & 0x100);
}
void setCPUTraceFlag(const bool CPUTraceFlag)
{
const INT16U MaskOfTraceFlag=((INT16U)CPUTraceFlag)<<8;
//setWordOfCPUFlags( (getWordOfCPUFlags() and ~MaskOfTraceFlag) ^ MaskOfTraceFlag);
if(CPUTraceFlag)
setWordOfCPUFlags( getWordOfCPUFlags() | MaskOfTraceFlag);
else
setWordOfCPUFlags( getWordOfCPUFlags() & ~MaskOfTraceFlag);
}
WHAT!?
Только я боюсь, что после этого будет где-нибудь:
2.5 Alternative tokens
P.S. Только это && а не &, & судя по ману доступен как bitand.
http://git.gnome.org/browse/gnome-system-monitor/tree/src/proctable.cpp
Толк от этой первой строки вообще есть какой?
xor eax, eax устранит зависимость eax от состояния, в котором он находился в предыдущих командах. Поэтому процессор сможет выполнить эти 2 команды, и ,возможно, следующую, не дожидаясь выполнения предыдущих команд, юзавших eax.
А так устраняется?
UPD: а зачем? Тогда уж лучше один mov eax, ... оставить.
Откуда зависимость появляется в mov ax, ... ? После mov ax, ... старшая часть eax вроде же все равно обнуляется?
Фу.
Походу нет. Смотри:
Если CPUTraceFlag == 0, то получаем set(get() & ~0) ^ 0 - т.е. ничего не изменится.
Если же CPUTraceFlag == 1, то получаем set(get() & ~(1 << 8)) ^ (1 << 8), что установит бит.
Дельфины какие-то приняли это в стандарт. :(
Но т.к. я не думаю, что автор кода будет менять какие-то биты кроме трейс флага, то вполне можно было сделать что-то типа
http://msdn.microsoft.com/en-us/library/aa983406(v=vs.80).aspx
http://msdn.microsoft.com/en-US/library/aa983392(v=vs.80)
И никакого ассемблера ;)