通過上面一篇了解了條件語句的使用,接下來就直接進行反彙編學習
#include void print()
}int main()
先f2在print()下個斷點,然後我們進入反彙編視窗
然後我們再f11兩下,跳兩下,進入函式內部
00873840 push ebp
00873841 mov ebp,esp
00873843 sub esp,0d0h
00873849 push ebx
0087384a push esi
0087384b push edi
0087384c lea edi,[ebp-0d0h]
00873852 mov ecx,34h
00873857 mov eax,0cccccccch
0087385c rep stos dword ptr es:[edi]
0087385e mov dword ptr [b],1
00873865 mov eax,dword ptr [b]
00873868 mov dword ptr [ebp-0d0h],eax
0087386e cmp dword ptr [ebp-0d0h],1
00873875 je print+42h (0873882h)
00873877 cmp dword ptr [ebp-0d0h],2
0087387e je print+51h (0873891h)
00873880 jmp print+60h (08738a0h)
00873882 push offset string "\xb5\xb1\xc7\xb0\xca\xc71" (0876b94h)
00873887 call _printf (08713b1h)
0087388c add esp,4
0087388f jmp print+6dh (08738adh)
00873891 push offset string "\xb5\xb1\xc7\xb0\xca\xc72" (0876be4h)
00873896 call _printf (08713b1h)
0087389b add esp,4
0087389e jmp print+6dh (08738adh)
008738a0 push offset string "unknow" (0876c0ch)
008738a5 call _printf (08713b1h)
008738aa add esp,4
008738ad pop edi
008738ae pop esi
008738af pop ebx
008738b0 add esp,0d0h
008738b6 cmp ebp,esp
008738b8 call __rtc_checkesp (087132fh)
008738bd mov esp,ebp
008738bf pop ebp
008738c0 ret
我們的**都是在緩衝區填充完資料之後的,才是真正的功能點
0087385e mov dword ptr [b],1 //把1賦值給b
00873865 mov eax,dword ptr [b] //把b給eax暫存器
00873868 mov dword ptr [ebp-0d0h],eax //把eax的值給 ebp-0d0h 這個位址上
接下來就開始進行比較了
0087386e cmp dword ptr [ebp-0d0h],1 //對比兩個值
00873875 je print+42h (0873882h) //je是當兩個數為相等的時候執行
00873877 cmp dword ptr [ebp-0d0h],2
0087387e je print+51h (0873891h)
00873880 jmp print+60h (08738a0h) //jmp無條件跳轉到 0x08738a0h 這個位址上
由上得知 eax=1 == 1,所以會跳到 0x0873882h 這個位址上面
00873882 push offset string "\xb5\xb1\xc7\xb0\xca\xc71" (0876b94h) //把字串壓入棧中
00873887 call _printf (08713b1h) //呼叫printf()函式列印出來
0087388c add esp,4 //棧頂提公升4位元組,也就是平棧
0087388f jmp print+6dh (08738adh) //直接跳到下面一段,完成功能執行
....
....
008738ad pop edi //恢復資料
008738ae pop esi //恢復資料
008738af pop ebx //恢復資料
008738b0 add esp,0d0h
008738b6 cmp ebp,esp
008738b8 call __rtc_checkesp (087132fh)
008738bd mov esp,ebp
008738bf pop ebp
008738c0 ret
#include void print()
int main()
00d43840 push ebp
00d43841 mov ebp,esp
00d43843 sub esp,0dch
00d43849 push ebx
00d4384a push esi
00d4384b push edi
00d4384c lea edi,[ebp-0dch]
00d43852 mov ecx,37h
00d43857 mov eax,0cccccccch
00d4385c rep stos dword ptr es:[edi]
int a = 10;
00d4385e mov dword ptr [a],0ah
int c = a > 11 ? 10 : 11;
00d43865 cmp dword ptr [a],0bh
00d43869 jle print+37h (0d43877h)
00d4386b mov dword ptr [ebp-0dch],0ah
00d43875 jmp print+41h (0d43881h)
00d43877 mov dword ptr [ebp-0dch],0bh
00d43881 mov eax,dword ptr [ebp-0dch]
00d43887 mov dword ptr [c],eax
}00d4388a pop edi
00d4388b pop esi
00d4388c pop ebx
00d4388d mov esp,ebp
00d4388f pop ebp
00d43890 ret
和if語句沒什麼區別,就不寫了,可以看看練習一 C語言之位運算子
位運算子分析 1.c語言中的位運算子 c語言中的位運算子直接對bit位進行操作,其效率最高。速度快於四則運算和邏輯運算。2.左移和右移的注意點 左運算元必須為整數型別 char和short被隱式轉換為int後進行移位操作 右運算元的範圍必須為 0,31 左移運算子 將運算數的二進位制位左移 規則 高...
C語言之運算子 (筆記)
下表顯示了 c 語言支援的所有算術運算子。假設變數 a 的值為 10,變數 b 的值為 20,則 運算子描述例項 把兩個運算元相加 a b 將得到 30 從第乙個運算元中減去第二個運算元 a b 將得到 10 把兩個運算元相乘 a b 將得到 200 分子除以分母 b a 將得到 2 取模運算子,整...
C語言之邏輯運算子 和
前言 伍 最近在刷劍指offer的面試題21的時候給 邏輯運算子坑的慘慘滴,足足浪費了我好些時間,耽誤了我西行的腳步 所以今天索性在此做乙個小總結給自己警醒一哈 1 和 2 這兩個邏輯運算子應該是做開發以來最常用的兩個運算子了,平常使用那是順手拈來,怎麼會有坑給人掉呢?可能也只能怪伍 水平不夠了,咱...