日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C代码+汇编 C的for汇编学习分析

發布時間:2024/4/19 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C代码+汇编 C的for汇编学习分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C語言的代碼

int main() {char myString[30];for(int i = 0;i < 30;i++){myString[i] = '#';}return 0; }

反匯編代碼 (32位寄存器 VC++ 6.0反匯編代碼)

0040B76E mov dword ptr [ebp-24h],0 //將 0 賦值給 ( ebp寄存器的內存地址-24H ) 內存地址 所指向的 值 0040B775 jmp main+30h (0040b780) //直接跳轉到 0040b780的地址處 0040B777 mov eax,dword ptr [ebp-24h] //將 (ebp寄存器內存地址-24H)的內存地址 賦值給 eax的寄存器 0040B77A add eax,1 // eax = eax + 1 0040B77D mov dword ptr [ebp-24h],eax //將eax的內存地址 賦值給 (ebp寄存器-24H)指向的內存地址 0040B780 cmp dword ptr [ebp-24h],1Eh //1EH = 30(十進制) 判斷 ebp寄存器-24H 所指向的內存地址的值 與 1EH(30)作比較 0040B784 jge main+40h (0040b790) //上面一句 如果大于等于 就跳轉到 0040b790的內存地址 0040B786 mov ecx,dword ptr [ebp-24h] // (ebp寄存器-24H)指向的內存地址 賦值給ecx寄存器 0040B789 mov byte ptr [ebp+ecx-20h],23h // 23H 在ASCLL碼表中 指 # , 含義為 將# 以單字節的形式 賦值給 ([ebp+ecx-20h)的內存地址 0040B78E jmp main+27h (0040b777) // 直接跳轉到 0040b777 指向的內存地址

附圖: (還不懂的話 我們接著來往下面)

讓我們一句一句的來(代碼按照執行邏輯分析)
1.mov dword ptr [ebp-24h],0
寄存器中 ESP寄存區指棧首 EBP寄存器指棧尾 將0以雙字類型的形式添加到ebp-24H的內存地址

問題1:為什么是24H呢?

答:24H = 36(十進制),C代碼中 char myString[30]; 數組的大小是30, 因為是32位寄存器,四字節,所以是32, 代碼中有for循環需要計數, 多了一個計數器存值的內存(我也是看了匯編內存才知道的…)

2.jmp main+30h (0040b780)
直接跳轉到 0040b780的內存地址,沒有什么好說的. 符合for循環的執行邏輯
3. cmp dword ptr [ebp-24h],1Eh
//1EH = 30(十進制) 判斷 ebp寄存器-24H 所指向的內存地址的值(19FF1C) 與 1EH(30)作比較
也就是拿 第一句 ebx的值 與 30比較 // C語言代碼 i < 30
4. jge main+40h (0040b790)
參考上一句 如果ebx>=30則跳轉到0040b790的內存地址 也是跳出循環
5.mov ecx,dword ptr [ebp-24h]
個人理解: ecx寄存器一般是計數寄存器,將 ebp寄存器-24H 所指向的內存地址的值(19FF1C) 0 賦值給 ecx寄存器,如圖

6.mov byte ptr [ebp+ecx-20h],23h
23H 在ASCLL碼表中 指 # , 含義為 將# 以單字節的形式 賦值給 ([ebp+ecx-20h)的內存地址,如圖

7. jmp main+27h (0040b777)
直接跳轉到 0040b777 指向的內存地址 循環判斷 執行
8.mov eax,dword ptr [ebp-24h]
9.add eax,1 // eax = eax + 1

將 (ebp寄存器內存地址-24H)的內存地址 賦值給 eax的寄存器,然后值在 +1 也就是計數器在+1.默認值是0


10. mov dword ptr [ebp-24h],eax
將eax的值 賦值到了 [ebp-24h]指向的內存地址的值(19FF1C)

這時執行第三步 進行判斷,然后重復執行直到退出循環

總結:
byte ptr [ebp+ecx-20h] //字節類型 00
word ptr [ebp-24h] /字類型 16位寄存器 0000
dword ptr [ebp-24h] //雙字類型 32為寄存器 00000000

疑問 字節類型為什么是兩個0?

答案 1byte=8bit
1 int = 4byte
字節類型 = 8byte 也就是2int 也就是 00
字類型 = 16byte 也就是4int’ 也就是 0000
雙字類型 = 32byte 也就是8int 也就是 00000000
指令的參考:https://blog.csdn.net/qq_35349982/article/details/98872417

總結

以上是生活随笔為你收集整理的C代码+汇编 C的for汇编学习分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。