我正在逆向工程,在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以下,所以這個黑客將值作爲有符號值,但是將負數和正數交換(不改變順序)。最終結果是所有數字都具有相同的順序(但不同的值),就好像它們首先是無符號的。
(...這是不是在這個程序中最糟糕的代碼示例)
確定代碼正確嗎?當然,它應該說'*價值'而不是'價值'。 – interjay
您提到了逆向工程。您用C編寫的代碼是否可能由彙編器轉換而來?在聲明中,SUB不僅減去,而且還設置在條件跳轉中使用的cpu標誌。字大小可能是16位,所以這可能是一個檢查的東西。 – typ1232
>當然,它應該說*價值而不是價值 - 是的,對不起,很快輸入,那部分不是未知的位。 – Bruce