c語言中的模運算是基本的運算,我們來看看debug模式下vs2008對下面的這句
求模運算的反彙編:
int b = a %(-8)
1. 0041366e 8b 45 f8 mov eax,dword ptr [a]
2. 00413671 99 cdq
3. 00413672 33 c2 xor eax,edx
4. 00413674 2b c2 sub eax,edx
5. 00413676 83 e0 07 and eax,7
6. 00413679 33 c2 xor eax,edx
7. 0041367b 2b c2 sub eax,edx
8. 0041367d 89 45 ec mov dword ptr [b],eax
第二句一上來可能有問題,這什麼意思?不知道什麼意思,最好就來除錯下,通過除錯,我們發現當a為正數時,語句2的效果是edx清零;如果a為負數,那麼可以發現edx的值變為0xffffffff;由此,我們可以推斷cdq的作用是對eax的最高符號位進行擴充套件,並且將值寫到edx中;
語句3和語句4同時對eax和edx進行操作,讓人一頭霧水,不知道在看什麼。同樣的道理,除錯上馬。通過除錯我們發現,這兩個語句會根據edx的擴充套件值對eax進行符號轉化,如果edx中是0xfffffff,那麼a的值就會變號;如果edx中的值為0,那麼這兩句並不會對a的值產生影響。
語句5很好理解,就是取模的運算。
語句6和7,與前面的語句語句的意思相同,只要edx擴充套件為負數,那麼這裡就會把正數轉化為負數。
常見指標和陣列的反彙編 x86
我學習逆向,整理的vc6編譯出來指標和陣列一些常見的反彙編筆記。由於我是新手,肯定有一些疏漏不完善的,我遇到了會實時更新的。一級指標定義5 int n 2 0040d428 mov dword ptr ebp 4 2 6 int p1 n 0040102f lea eax,ebp 4 0040103...
x86彙編CF和OF的區別
1.溢位標誌位of 帶符號數的算術運算結果,若超出了8位或16位數所能表達的範圍時,of 1,表示產生溢位 否則of 0.8位數應該在 128至 127之間,16位數在 32768至 32767.2.進製標誌位cf 當指令執行的結果在最高位出現進製或借位時,cf 1 否則為0.最高位進製了不就是溢位...
x86彙編中巨集的使用
定義格式 巨集指令名 macro 形式引數 形式引數 巨集體 endm 注意事項 先定義後使用 macro與endm成對使用 使用舉例 write string macro a lea dx,a mov ah,9 int21h endmrclf db 0dh,0ah,write string rcl...