滴水逆向筆記系列-c語言總結4-15.switch語句反彙編-16.指標1-17.指標2

小新07發表於2024-03-14

第十五課 c語言8 switch語句

初步測試感覺switch在反彙編的語句和if語句的唯一差別就是jcc語句比較集中image.png
當分支大於四條時,switch的反彙編開始變
image.png
3為switch傳入的值,1是case最小值,4是case最大值減1,算出偏移量後透過偏移量4加上基址就可以在大表中獲取要輸出的case語句的地址
image.png
當現在case的值不連續,空掉一個202時,大表的第二個地址會用default填充,如果case從201到209,我們刪掉中間三四個值,他還是會用default填充
image.png
如果是刪剩201,207,208,209,那麼switch反彙編又會開始不一樣,會生成一張大表和小表,從小表查出偏移量,再去
4加上基址得出case想要輸出的語句的地址,小表有00,01,02,03,04對應著大表五個地址,分別是201,209,210,211和default的輸出語句,和只有一張大表直接用default填充的方法相比,這個只需用一個位元組04這個偏移量來填充,而04偏移量指向的就是default的地址,更省空間
image.png
image.png

總結

4、分支少於4時,用switch沒有意義,因為編譯器會生成類似if...else之類的反彙編.
5、case後面的常量可以是無序的,並不響大表的生成
6、所以switch語句的case最好是相近連續的,他可以生成大表,比if...else語句效率更高
7、抹去一兩項會直接在大表用default語句的地址填充
8、抹去多項時,會生成一個小表代替大表填充default的地方
9、會使用類似if..else反彙編

作業

image.png

第十六課 c語言9指標1

1.宣告

在之前學習的任何型別都可以加上數個*,就變成了一種新的型別,叫做指標。
image.png

總結:

image.png

2.寬度

和區域性變數不一樣,雖然都是佔12個位元組,但是真正使用時不管char,short還是int或者結構體型別也都還是4個位元組
image.png

3.賦值

完整寫法賦值
image.png

總結:

image.png

4.+-常數

image.png
image.pngimage.png
我們暫時先理解加號這種型別的++--的運算是不一樣的,不是直接加1,而是加上自身減去一個的寬度,比如char**減去一個號為char,char寬度為4個位元組,所以char的++應該是+4
image.png
+5和++同理,相當於五個++

總結 :

image.png

5.求差值

還是同理,砍星後根據寬度去除
而且求差值還得相同型別才可以相加減
兩個char相減得出的結果是一個int型別,不能用char接收
image.pngimage.png
image.png

總結:

image.png

6.比較

總結:

image.png

作業

image.png
1、1,4,4
2、40
image.png
image.png
image.png
image.png
image.png

第十七課 c語言10 指標2

1.型別轉換

基本資料型別之間可以直接賦值或者強轉
image.pngimage.png
基本資料型別和其他型別之間則無法直接賦值或者強轉
image.pngimage.png
指標之間可以強轉但是不會自動轉換直接賦值
image.pngimage.pngimage.png
一級指標二級指標之間也沒辦法自動轉換直接賦值,但是可以強轉
image.pngimage.png

2.&地址符

&可以去變數的地址,我們現在取完放在char y變數,發現報錯了char不能轉為char型別,得知**&取地址後是char型別
image.png
char型別的變數x取地址後是char*型別**
image.png

&取地址符反彙編

image.png
image.png

3.*取值符

*的型別

image.png

*反編譯

image.png
從這個例子已經可以看出上節課指標型別運算為什麼不同了
image.png

作業

image.png
image.png
image.png
image.png
image.png
image.png

相關文章