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寄存器的內(nèi)存地址-24H ) 內(nèi)存地址 所指向的 值 0040B775 jmp main+30h (0040b780) //直接跳轉(zhuǎn)到 0040b780的地址處 0040B777 mov eax,dword ptr [ebp-24h] //將 (ebp寄存器內(nèi)存地址-24H)的內(nèi)存地址 賦值給 eax的寄存器 0040B77A add eax,1 // eax = eax + 1 0040B77D mov dword ptr [ebp-24h],eax //將eax的內(nèi)存地址 賦值給 (ebp寄存器-24H)指向的內(nèi)存地址 0040B780 cmp dword ptr [ebp-24h],1Eh //1EH = 30(十進(jìn)制) 判斷 ebp寄存器-24H 所指向的內(nèi)存地址的值 與 1EH(30)作比較 0040B784 jge main+40h (0040b790) //上面一句 如果大于等于 就跳轉(zhuǎn)到 0040b790的內(nèi)存地址 0040B786 mov ecx,dword ptr [ebp-24h] // (ebp寄存器-24H)指向的內(nèi)存地址 賦值給ecx寄存器 0040B789 mov byte ptr [ebp+ecx-20h],23h // 23H 在ASCLL碼表中 指 # , 含義為 將# 以單字節(jié)的形式 賦值給 ([ebp+ecx-20h)的內(nèi)存地址 0040B78E jmp main+27h (0040b777) // 直接跳轉(zhuǎn)到 0040b777 指向的內(nèi)存地址附圖: (還不懂的話 我們接著來往下面)
讓我們一句一句的來(代碼按照?qǐng)?zhí)行邏輯分析)
1.mov dword ptr [ebp-24h],0
寄存器中 ESP寄存區(qū)指棧首 EBP寄存器指棧尾 將0以雙字類型的形式添加到ebp-24H的內(nèi)存地址
問題1:為什么是24H呢?
答:24H = 36(十進(jìn)制),C代碼中 char myString[30]; 數(shù)組的大小是30, 因?yàn)槭?2位寄存器,四字節(jié),所以是32, 代碼中有for循環(huán)需要計(jì)數(shù), 多了一個(gè)計(jì)數(shù)器存值的內(nèi)存(我也是看了匯編內(nèi)存才知道的…)
2.jmp main+30h (0040b780)
直接跳轉(zhuǎn)到 0040b780的內(nèi)存地址,沒有什么好說的. 符合for循環(huán)的執(zhí)行邏輯
3. cmp dword ptr [ebp-24h],1Eh
//1EH = 30(十進(jìn)制) 判斷 ebp寄存器-24H 所指向的內(nèi)存地址的值(19FF1C) 與 1EH(30)作比較
也就是拿 第一句 ebx的值 與 30比較 // C語言代碼 i < 30
4. jge main+40h (0040b790)
參考上一句 如果ebx>=30則跳轉(zhuǎn)到0040b790的內(nèi)存地址 也是跳出循環(huán)
5.mov ecx,dword ptr [ebp-24h]
個(gè)人理解: ecx寄存器一般是計(jì)數(shù)寄存器,將 ebp寄存器-24H 所指向的內(nèi)存地址的值(19FF1C) 0 賦值給 ecx寄存器,如圖
6.mov byte ptr [ebp+ecx-20h],23h
23H 在ASCLL碼表中 指 # , 含義為 將# 以單字節(jié)的形式 賦值給 ([ebp+ecx-20h)的內(nèi)存地址,如圖
7. jmp main+27h (0040b777)
直接跳轉(zhuǎn)到 0040b777 指向的內(nèi)存地址 循環(huán)判斷 執(zhí)行
8.mov eax,dword ptr [ebp-24h]
9.add eax,1 // eax = eax + 1
將 (ebp寄存器內(nèi)存地址-24H)的內(nèi)存地址 賦值給 eax的寄存器,然后值在 +1 也就是計(jì)數(shù)器在+1.默認(rèn)值是0
10. mov dword ptr [ebp-24h],eax
將eax的值 賦值到了 [ebp-24h]指向的內(nèi)存地址的值(19FF1C)
這時(shí)執(zhí)行第三步 進(jìn)行判斷,然后重復(fù)執(zhí)行直到退出循環(huán)
總結(jié):
byte ptr [ebp+ecx-20h] //字節(jié)類型 00
word ptr [ebp-24h] /字類型 16位寄存器 0000
dword ptr [ebp-24h] //雙字類型 32為寄存器 00000000
疑問 字節(jié)類型為什么是兩個(gè)0?
答案 1byte=8bit
1 int = 4byte
字節(jié)類型 = 8byte 也就是2int 也就是 00
字類型 = 16byte 也就是4int’ 也就是 0000
雙字類型 = 32byte 也就是8int 也就是 00000000
指令的參考:https://blog.csdn.net/qq_35349982/article/details/98872417
總結(jié)
以上是生活随笔為你收集整理的C代码+汇编 C的for汇编学习分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 获取元素,同级元素下的子元素总结
- 下一篇: C代码+汇编 C的 函数汇编学习分析