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汇编学习分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 获取元素,同级元素下的子元素总结
- 下一篇: C代码+汇编 C的 函数汇编学习分析