- 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);
}
bormand 26.06.2012 17:05 # +5
WHAT!?
guest 26.06.2012 17:09 # +3
HaskellGovno 26.06.2012 17:16 # +3
Только я боюсь, что после этого будет где-нибудь:
guest 26.06.2012 17:55 # 0
HaskellGovno 26.06.2012 17:09 # +1
HaskellGovno 26.06.2012 17:10 # +1
rat4 26.06.2012 19:12 # +5
2.5 Alternative tokens
bormand 26.06.2012 19:18 # 0
P.S. Только это && а не &, & судя по ману доступен как bitand.
rat4 26.06.2012 20:24 # +2
http://git.gnome.org/browse/gnome-system-monitor/tree/src/proctable.cpp
bormand 26.06.2012 20:33 # +1
rat4 26.06.2012 20:46 # +2
HaskellGovno 26.06.2012 17:13 # 0
Толк от этой первой строки вообще есть какой?
bormand 26.06.2012 17:21 # +2
xor eax, eax устранит зависимость eax от состояния, в котором он находился в предыдущих командах. Поэтому процессор сможет выполнить эти 2 команды, и ,возможно, следующую, не дожидаясь выполнения предыдущих команд, юзавших eax.
HaskellGovno 26.06.2012 17:22 # 0
А так устраняется?
bormand 26.06.2012 17:25 # +1
UPD: а зачем? Тогда уж лучше один mov eax, ... оставить.
HaskellGovno 26.06.2012 17:25 # −2
Откуда зависимость появляется в mov ax, ... ? После mov ax, ... старшая часть eax вроде же все равно обнуляется?
bormand 26.06.2012 17:28 # +2
bormand 26.06.2012 17:33 # +2
eth0 26.06.2012 18:52 # +2
bormand 26.06.2012 18:56 # +1
HaskellGovno 26.06.2012 19:15 # 0
bormand 26.06.2012 19:33 # 0
Фу.
Походу нет. Смотри:
Если CPUTraceFlag == 0, то получаем set(get() & ~0) ^ 0 - т.е. ничего не изменится.
Если же CPUTraceFlag == 1, то получаем set(get() & ~(1 << 8)) ^ (1 << 8), что установит бит.
bormand 26.06.2012 19:52 # 0
HaskellGovno 26.06.2012 21:45 # +3
Дельфины какие-то приняли это в стандарт. :(
bormand 27.06.2012 05:20 # +4
HaskellGovno 27.06.2012 07:10 # 0
bormand 27.06.2012 07:18 # +3
TarasB 27.06.2012 09:13 # +5
bormand 27.06.2012 09:23 # +4
Lure Of Chaos 27.06.2012 23:09 # +2
inkanus-gray 14.09.2012 17:45 # +1
HaskellGovno 28.06.2012 00:13 # +1
bormand 28.06.2012 08:00 # +1
Но т.к. я не думаю, что автор кода будет менять какие-то биты кроме трейс флага, то вполне можно было сделать что-то типа
HaskellGovno 28.06.2012 09:17 # 0
bormand 28.06.2012 09:45 # +1
HaskellGovno 28.06.2012 11:04 # +3
bormand 28.06.2012 11:59 # +1
bormand 28.06.2012 13:00 # +3
http://msdn.microsoft.com/en-us/library/aa983406(v=vs.80).aspx
http://msdn.microsoft.com/en-US/library/aa983392(v=vs.80)
И никакого ассемблера ;)
L5D 25.08.2021 05:13 # 0