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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。