2014-01-23 51 views
2

我正在逆向工程,在Win95下運行(是的,在生產中)似乎已經用Borland編譯器(我沒有工具鏈)編譯過。從int中減去0x8000

有哪些呢(除其他事項外)的功能是這樣的:

static void unknown(int *value) 
{ 
    int v = *value; 
    v-=0x8000; 
    *value = v; 
} 

我不能完全制定出這是什麼一樣。我假設在這種情況下'int'是有符號的32位。我認爲0x8000將是無符號的32位int,並且在有符號的32位int的範圍之外。 (編輯 - 這是錯誤的,它是在一個有符號的16位整數之外)

我不確定這些中的一個是否會先投,以及如何處理溢出,和/或減法如何處理過流。

我可以嘗試一個現代系統,但我也不確定結果是否相同。

編輯清晰度:

1:'v- = 0x8000;'從原來的代碼是直接的,這對我來說沒什麼意義。 v被定義爲一個int。

2:我有代碼,這不是來自asm。

3:原始代碼非常非常糟糕。

編輯:我有答案!下面的答案並不完全正確,但它讓我在那裏(修復,我將它標記爲答案)。

v中的數據來自一個模糊的來源,實際上它似乎正在發送無符號的 16位數據,但它被存儲爲帶符號的int。在程序後面,所有的值都被轉換爲浮點數並歸一化爲平均0點,所以實際值並不重要,只有順序。因爲我們將無符號整數視爲有符號整數,所以32767以上的值錯誤地放置在0以下,所以這個黑客將值作爲有符號值,但是將負數和正數交換(不改變順序)。最終結果是所有數字都具有相同的順序(但不同的值),就好像它們首先是無符號的。

(...這是不是在這個程序中最糟糕的代碼示例)

+2

確定代碼正確嗎?當然,它應該說'*價值'而不是'價值'。 – interjay

+1

您提到了逆向工程。您用C編寫的代碼是否可能由彙編器轉換而來?在聲明中,SUB不僅減去,而且還設置在條件跳轉中使用的cpu標誌。字大小可能是16位,所以這可能是一個檢查的東西。 – typ1232

+0

>當然,它應該說*價值而不是價值 - 是的,對不起,很快輸入,那部分不是未知的位。 – Bruce

回答

3

在Borland C 3.x中,intshort是相同的:16位。 long是32位。

甲字面六角具有其中值可以表示所述第一類型:intunsigned intlong intunsigned long int

在Borland C的情況下,0x8000是32768的十進制值,不適合int,但將在unsigned int中。所以unsigned int是。

聲明v -= 0x8000 ;相同v = v - 0x8000 ;

在右手側上,intv被隱含轉換成unsigned int,每規則,進行算術運算,產生一個rval,其爲unsigned int。那麼unsigned int然後按照規則再隱含地轉換回lval的類型。

所以,根據我的估計,最終效果是切換符號位—,通過簡單的位混合可以更容易和明確地完成某些操作:*value ^= 0x8000 ;

+0

0x8000 == 32768 –

+0

@PeterGibson。修復它爲你。仍然不適合16位有符號整數。顯然,今天我沒有足夠的咖啡:D –

+0

謝謝,現在喝我的杯子:)也不是這個*切換*符號位,而不是清除它? –

1

有可能http://www.ousob.com/ng/borcpp/nga0e24.php此頁面上的一個線索 - 指南的Borland C++ 2.X(採用Turbo C)

沒有這樣的東西作爲負數字常量。如果 負號在數值常數之前,則它被視爲 一元減號運算符,它與常數 構成數字表達式。這對於 -32768很重要,雖然它可以表示爲int,但 實際上具有long int類型,因爲32768的類型爲long。爲了 得到期望的結果,您可以使用(INT)-32768, 爲0x8000,或0177777.

這意味着負數使用two's complement。有趣的是,0x8000的二進制補碼本身是0x8000(因爲值+32768不符合簽名2字節整數的範圍)。

那麼這對您的功能意味着什麼?逐位,這有切換符號位的效果,下面是一些例子:

f(0) = f(0x0000) = 0x8000 = -32768 
f(1) = f(0x0001) = 0x8001 = -32767 
f(0x8000) = 0 
f(0x7fff) = 0xffff 

看起來這可以表示爲val ^= 0x8000,但也許是XOR運算符沒有在Borland的實現回來呢?

+0

這是有道理的。 0x8000是十進制的「32768」。 '0177777'(八進制)是十進制的「65535」。 – 2014-01-24 00:06:09

+0

這真的有幫助,但我仍然不確定最終的結果是什麼。 – Bruce

+0

感謝您的支持,我剛剛看到Nicholas Carey的編輯。 – Bruce