今天遇到了取模的問題,記錄一下。
參考c++反彙編與逆向這本書,如下:
在vc++6.0中,對兩個變數取模或者對非2的冪取模,可直接使用div或idiv指令完成,餘數在dx或者是edx中。對2的k次方取餘,餘數的值只需取得被除數二進位制數值中的最後k位的值即可,負數則還需在k位之前補1,設k為5,可以得到以下**:
mov reg,被除數
and reg,8000001fh
jns lab1
or reg,0ffffffe0h
lab1:
如果餘數的值非零,以上**是沒有問題的;如果餘數的值為零,則根據以上**計算出的結果(ffffffe0)是錯誤的。因此應該加以調整,調整的方法為在or運算之前減1,在or運算之後加1.對於餘數不為0的情況,此調整不影響計算結果;對於餘數為0的情況,末尾k位全部為0值,此時減1得到末尾k位為1,or運算得到-1,最後加1得到餘數值為0.調整後**如下:
mov reg,被除數
and reg,8000001f;這裡的立即數是去掉高位保留低位的掩碼,其值由2^k決定
jns lab1
dec reg
or reg,ffffffe0
inc reg
lab1:
當遇到以上指令序列時,基本可判定是取模**,其取模原型為被除數(變數)對2^k(常量)執行取模運算,jns可表明是有符號計算,考察"and reg,8000001f"這類去掉高位保留低位的**,統計出一共保留了多少低位,即可得到k的值,代入求得2^k的值後,可恢復取模**原型。 取模操作 補充說明
在演算法中,有時候要用到取模操作,為的是避免資料過大溢位,而有時候只需要驗證演算法的有效性,並關心實際的值,下面給出取模操作的性質以及乙個簡單的應用例子。a b c a c b c c a b c a c b c c a b c a c b c c a b c not equal to a c b ...
Qt四捨五入取模取餘操作
qt中有兩個函式進行四捨五入操作 qround與qround64。qint64 qround64 qreal value 將qreal型別的數值,四捨五入後返回乙個最近64位的整數,示例 qreal valuea 42949672960.3 qreal valueb 42949672960.7 in...
反彙編個人練習 不用迴圈語句實現迴圈操作
includeusing namespace std int main int a 10 if a 0 while true else cout 部分彙編語句 3 int main 4 00401780 push ebp main 00401780,該函式指令的首位址,函式名代表該函式內第一條指令的...