Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Re: Это все разговоры, а нужно решение 05.02.02 16:30 Число просмотров: 897
Автор: leo <Леонид Юрьев> Статус: Elderman
|
Выключение оптимизации конечно даст нужный эффект. Но я использую шаблоны, поэтому если идти этим путем, то выключать потимизаци. нужно вообще...
Сейчас я вызываю внешнюю пустую dummy-функцию, которая кроме RET ничего не далеет.
Примерно так:
void __fastcall DummyVolatileNoop(const unsigned __int8 dummy);
void __fastcall DummyVolatileNoop(const unsigned __int16 dummy);
void __fastcall DummyVolatileNoop(const unsigned __int32 dummy);
...
template <bool MemoryMapped, bool IoPause> class THardwareIo
{
public:
...
template <typename type> __forceinline static void CommitVolatileRead(const type Value)
{
if(MemoryMapped)
DummyVolatileNoop(Value);
}
...
}
...
template <class THardwareIo> class CL_VGA
{
public:
LyWin2000Kernel::THardwareIoAddress FrameBufferAddress;
LyWin2000Kernel::THardwareIoAddress BaseIoAddress;
LyWin2000Kernel::THardwareIoAddress ExRomAddress;
LyWin2000Kernel::THardwareIoAddress GpioAddress;
....
__forceinline void WriteHiddenDAC(const unsigned __int8 value) const // hirgwr
{
THardwareIo::CommitVolatileRead(
ReadRegisterByte(VGA_VideoDacPixelMask_HiddenDac)
| ReadRegisterByte(VGA_VideoDacPixelMask_HiddenDac)
| ReadRegisterByte(VGA_VideoDacPixelMask_HiddenDac)
| ReadRegisterByte(VGA_VideoDacPixelMask_HiddenDac)
);
WriteRegisterByte(VGA_VideoDacPixelMask_HiddenDac, value);
}
__forceinline unsigned __int8 ReadHiddenDAC() const // hirgrd
{
THardwareIo::CommitVolatileRead(
ReadRegisterByte(VGA_VideoDacPixelMask_HiddenDac)
| ReadRegisterByte(VGA_VideoDacPixelMask_HiddenDac)
| ReadRegisterByte(VGA_VideoDacPixelMask_HiddenDac)
| ReadRegisterByte(VGA_VideoDacPixelMask_HiddenDac)
);
return ReadRegisterByte(VGA_VideoDacPixelMask_HiddenDac);
}
...
// ------------- extern asm-файл
[section .text]
[global ?DummyVolatileNoop@LyWin2000Kernel@@YIXPBX@Z]
[global ?DummyVolatileNoop@LyWin2000Kernel@@YIX_K@Z]
...
[global ?ReadVolatileQuad@LyWin2000Kernel@@YI_KK@Z]
[global ?ReadVolatileLong@LyWin2000Kernel@@YIIK@Z]
[global ?ReadVolatileWord@LyWin2000Kernel@@YIGK@Z]
[global ?ReadVolatileByte@LyWin2000Kernel@@YIEK@Z]
?ReadVolatileByte@LyWin2000Kernel@@YIEK@Z:
mov al, [ecx]
?DummyVolatileNoop@LyWin2000Kernel@@YIXPBX@Z:
?DummyVolatileNoop@LyWin2000Kernel@@YIX_K@Z:
...
ret
?ReadVolatileWord@LyWin2000Kernel@@YIGK@Z:
mov ax, [ecx]
ret
?ReadVolatileLong@LyWin2000Kernel@@YIIK@Z:
mov eax, [ecx]
ret
?ReadVolatileQuad@LyWin2000Kernel@@YI_KK@Z:
mov eax, [ecx]
mov edx, [ecx + 4]
ret
---
|
|
|