2012-11-18 42 views
0

所以我得到吸吮的thoose「標誌」和字節操作所以這裏的彙編代碼:字節操作編譯

loc_4097F5: 
    .text:004097F5  cmp  [esi+1Bh], dl 
    .text:004097F8  jnz  short loc_409812 
    .text:004097FA  cmp  [esi+6], dl 
    .text:004097FD  jnz  short loc_409812 
    .text:004097FF  mov  ecx, [ebp+490h] 
    .text:00409805  test cl, 2 ; How to represent this???? 
    .text:00409808  jz  short loc_40980F 
    .text:0040980A  test ch, 1 ; How to represent this???? 
    .text:0040980D  jz  short loc_409812 
    .text:0040980F loc_40980F:       
    .text:0040980F  mov  [esi+25h], dl 
    .text:00409812 loc_409812:      
    .text:00409812  mov  ecx, [esp+18h+arg_0] 
    .text:00409816  cmp  [ecx+8Ch], eax 

這裏是通過反編譯器產生的僞代碼:

v13 = a3->field_454.TextureCaps; 
    if (!(v13 & 2) || BYTE1(v13) & 1) 
    *(_BYTE *)(v5 + 37) = v3; 

任何想法如何代表此爲VC++ 6.0編譯器(與此代碼編譯)?

編輯:其實a3-> field_454是一個D3DCAPS9結構。

回答

1

不知道你還需要什麼,除了反編譯版本中已經存在的東西。 您當然可以查看d3d標頭中的TextureCaps標誌位,以更好地理解這一點。我相信這是正確的:

if (!(TextureCaps & D3DPTEXTURECAPS_POW2) || (TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL)) 

因此,它的測試,以查看是否非冪的兩個紋理都無條件地支持或不(在條件計算爲true如果他們不支持)。 另請參閱相關的msdn page

+0

奇怪在這裏我讀:http://en.wikipedia.org/wiki/TEST_(x86_instruction),如果「如果AND的結果是0,ZF設置爲1,否則設置爲0」。但它似乎是相反的......無論如何這工作!謝謝! –

+0

@ sasho648:不,這是正確的,這正是代碼的作用。如果第一個「AND」結果爲0,則執行「0040980F」處的指令。否則,如果第二個「AND」結果爲0,那麼該指令被繞過,因爲代碼跳轉到了「00409812」。因此,要執行該指令,第一個AND必須導致0 *或*第二個AND必須導致非0。 – DCoder