C語言之 Switch和 運算子的反彙編

2022-01-10 02:52:43 字數 4616 閱讀 6389

通過上面一篇了解了條件語句的使用,接下來就直接進行反彙編學習

#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 這兩個邏輯運算子應該是做開發以來最常用的兩個運算子了,平常使用那是順手拈來,怎麼會有坑給人掉呢?可能也只能怪伍 水平不夠了,咱...